Autor Zpráva
Wool
Profil *
Přeju hezké odpoledne,

můj dotaz se váže na rozšiřování třídy pomocí class extends. Rád bych věděl, jestli je nějak možné za běhu aplikace udělat něco tohoto typu:

Mám třídu dejme tomu Pozdravy definuju si podle ní proměnnou
class Pozdravy
{
	function ahoj(){
		
		return 'Ahoj';
	
	}
}

$output = new Pozdravy;


Teď běží aplikace, nabalují se další soubory a najednou přijdu na to, že potřebuji přidat i specifické případy této třídy a tak si definuji proměnnou jako tento specifický případ
class slusnePozdravy extends Pozdravy
{

	function dobryDen(){
	
		return 'Dobry den';
	
	}

}


$output = new slusnePozdravy;


Aplikace dál běží a najednou tu je další rozšíření.
class jinePozdravy extends Pozdravy
{

	function namazSi(){
		
		return 'Namaz si drzku sadlem';	
	}
	
}

No a tady je můj problém. Rád bych tohle rozšíření přidal, ale pokud to jako v předchozím bloku přiřadím proměnné $output, tak ztratím funkci dobryDen(), což nechci, ale zároveň při psaní třídy nevím, jestli v tom konkrétním běhu aplikace se objeví i slusnePozdravy, takže nemohu použít class jinePozdravy extends slusnePozdravy.

Existuje nějaké řešení jak docílit takového rozšíření?

P.S.: Tenhle příklad berte s nadsázkou, realita je komplexnější, ale technicky to odpovídá.
Jan Tvrdík
Profil
Wool:
Chápu to dobře, že si potřebuješ do třídy doplnit metodu, kterou nemá?
V C# je na to tzv. Extension method. V PHP nic takového neexistuje. Nette Framework to řeší pomocí třídy Nette\Object, takže jestli chceš podobného efektu dosáhnout, tak si stáhni Nette a poděď si třídu od Nette\Object.
Timy
Profil
Wool
Pokud i v jinePozdravy potřebuješ zavolat dobryden(), tak máš špatně současný návrh. Pokud tu metodu dobryden() mají mít všichni potomci třídy Pozdravy, pak musí být metoda definována už v této třídě. Pokud ji mají mít jen některé třídy, pak by ty třídy měly mít nějakého dalšího rodiče – buď pomocí vícenásobné dědičnosti nebo pomocí rozhraní (interface).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0