call_user_func + $this
Sziasztok!
Call_user_func függvénnyel hívok meg egy statikus osztály metódust PHP4-ben, egy objektumon belülről. Alapesetben, a ClassName::Method() módszert használva a meghívott metódusban a $this változó a meghívó objektumra fog mutatni, azonban a fenti függvényt használva a hívott metódusban nincs $this változó. Ez tény, meg is találtam a Zend-féle PHP levlistán a problémát, a válasz egy igen, ezt valóban ki kellene javítani volt - 4 éve.
A kérdésem az lenne, hogy van-e valami mód arra, hogy meghívjam egy dinamikus nevű osztály dinamikus nevű metódusát úgy, hogy abban a $this változó elérhető és a hívó objektumra mutat?
■ Call_user_func függvénnyel hívok meg egy statikus osztály metódust PHP4-ben, egy objektumon belülről. Alapesetben, a ClassName::Method() módszert használva a meghívott metódusban a $this változó a meghívó objektumra fog mutatni, azonban a fenti függvényt használva a hívott metódusban nincs $this változó. Ez tény, meg is találtam a Zend-féle PHP levlistán a problémát, a válasz egy igen, ezt valóban ki kellene javítani volt - 4 éve.
A kérdésem az lenne, hogy van-e valami mód arra, hogy meghívjam egy dinamikus nevű osztály dinamikus nevű metódusát úgy, hogy abban a $this változó elérhető és a hívó objektumra mutat?
Érdekes
A megoldás egyszerű: legyen egy paramétere a ClassName::Method(&$param) statikus metódusnak, amit aztán úgy hívsz meg az objektumod nem statikus metódusából, hogy ClassName::Method($this). És ekkor a statikus metóduson belül $this helyett $param referenciával hivatkozhatsz az objektumodra.
Tény
Pontosan a $this paraméterként való átadását szeretném ekerülni, milliónyi változó argumentumszámú metódusnál nem szeretnék ezzel szöszölni, főleg hogy Class::Method() formában is meghívásra kerülnek.
Mindenesetre jobbhíján ha szükséges létrehozok egy-egy instance-t az osztályból, a konstruktor meg szépen beállítja a $this-t a szülőobjektumra. (Vagyis nem szépen, de beállítja :))
statikus?
statikus metódusban nincs $this
Üdv,
Felhő
Statikus metódus és a meghívó objektum
Egyébként a konkrét problémára visszatérve, a $this nálam mindenhol egy szuperobjektumként szerepel - ezen át érhető el a rendszer bármely része - és ehhez kéne hozzáférést biztosítani ezen metódusokban. Az ezeket tartalmazó osztályok gyakorlatilag csupán névtér szerepét töltik be, illetve - ha nem lenne ez a call_user_func bug - biztosítanák, hogy a szuperobjektum elérhető legyen. Végülis túl sokat nem számít, hogy a háttérben létrejön-e ezekből egy instance, tehát jobb híján ez a megoldás marad.
tervezés
Pontosan nem derül ki, hogy mire használnád, de szerintem Singleton, Factory, Registry patternek használata kifejezőbb lenne. Vagy pl. $this->valamiRendszerszintuObj helyett tisztább egy System::getValamiRendszerszintuObj().
Üdv,
Felhő
call_user_func_array?