V těchto věcech si nejsem nikdy jist a občas si musím napsat modelový
miniprográmek, abych věděl, jak se PHP zachová. V uvedeném příkladu
vypisuji název aktuální třídy pomocí funkce get_class($this)
a „magické“ konstanty __CLASS__
. Konstanta má tu výhodu, že
ji lze užít i ve statické metodě (tam není definováno
$this
). Otázka je, jestli i ve zděděné třídě vypíší
totéž. Tak co, programátoři?
class A {
function showClassName() {
echo get_class($this) . ' ' . __CLASS__;
}
}
class B extends A {
}
$foo = &new B();
$foo->showClassName();
Komentáře
Mormegil #1
IMHO to samozrejme vypise „B A“. Nikdy jsem to nepouzival, ale prijde mi to uplne samozrejme.
__CLASS__
je staticka informace, ergo nepotrebuje $this. Oproti tomu, jak by mela poznat, v jakem kontextu se vola, kdyby opravdu byla staticka? Naopak get_class($this) zjistuje, co je zac $this.johno #2
Pravá sranda je to, že
get_class()
v PHP4 vracia ‚lowercase‘ názov triedy a v PHP5 už normálne.lamka #3
Nevíte někdo prosím jak tedy implementovat statickou funkci getInstance(), která bude vracet instanci, třídy kterou byla volána.
př.//
$object = Class::getClassName(); // $object obsahuje new Class;
lamka #4
Sorry oprava u příkladu :
$object = Class::getInstance(); // $object obsahuje new Class;
David Grudl #5
To by asi nešlo… Ale když už napíšu
$object = Class::getInstance();
tak proč prostě rovnou nenapsat:
$object = &new Class();
nebo to potřebuješ v jiném kontextu?
xert #6
mozna uz jsem mimo, ale proc by to neslo?
David Grudl #7
#6 xerte, to ale není totéž, co #3 lamka požadoval.
V PHP5 lze použít něco takového:
PHP4 klíčové slovo self nezná, existuje tu však náhradní cesta:
Oba příklady však mají vadu – nebudou korektně fungovat pro zděděné třídy. Vždy se totiž vrátí instance třídy, ve které je metoda getInstance() definována.
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.