ugrás a tartalomhoz

call_user_func + $this

kicsy · 2007. Feb. 24. (Szo), 01.40
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?
 
1

Érdekes

Rici · 2007. Feb. 24. (Szo), 11.17
Ez a fajta működése a php-nek roppant érdekes az összes többi objektumorientált nyelvvel szemben megvalósítva. A this mindig csak akkor mutathat valamire, ha az aktuálisan futó kód egy osztálynak egy nem statikus metódusa. Ha meghívsz innen egy globális függvényt vagy egy statikus metódust, akkor nem szabadna, hogy legyen this pointered, ami mondjuk az utolsó nem statikus metódusnak az objektumára mutat. Amit a php csinál, az egyszerűen ellenkezik minden épeszű felfogással.

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.
2

Tény

kicsy · 2007. Feb. 24. (Szo), 15.14
Valóban érdekes a megvalósítás, de nekem személy szerint tetszik :) Gyakorlatilag arról van szó, hogy az aktuálisan futó metódus az, ahonnan meghívtuk a statikus metódust.
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 :))
3

statikus?

vbence · 2007. Feb. 24. (Szo), 15.40
Lehet, hogy én tudom rosszul, de a statikus metódusnak nem épp az a lényege, hogy nincs this :)
4

statikus metódusban nincs $this

Hodicska Gergely · 2007. Feb. 24. (Szo), 16.02
Nem teljesen látom át a problémádat. Az biztos, hogy PHP esetén vannak furcsaságok (következetlenségek) ilyesmi esetben, viszont egy statikus metódusban eleve nem lenne szabad használni a $this kulcsszót. Igazából PHP4 esetén nincs is igazi statikus metódus, kb. pont attól hívható egy függvény statikusként, hogy nem használja a $this-t.


Üdv,
Felhő
5

Statikus metódus és a meghívó objektum

kicsy · 2007. Feb. 24. (Szo), 23.38
Én inkább úgy fogalmaznék, hogy attól statikus, hogy egy objektumpéldány létrehozása nélkül hívjuk meg ;) Ebből következik, hogy nincs benne $this, hisz mire is mutathatna. PHP-ben ugyanakkor van egy olyan lehetőség, hogy ezen statikus metódusokban elérhető az őket meghívó objektum. Valamiért ezt is a $this változón keresztül érhetjük el, ami elég zavaró, lehetne $parent vagy akár $Elemér is. Mindenesetre én ezt nem nevezném következetlenségnek, inkább egy (szerintem hasznos) nyelvi elemnek/lehetőségnek.
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.
6

tervezés

Hodicska Gergely · 2007. Feb. 25. (V), 00.55
PHP-ben ugyanakkor van egy olyan lehetőség, hogy ezen statikus metódusokban elérhető az őket meghívó objektum.
Megvallom, ez a kitétel elkerülte eddig a figyelmemet...

Mindenesetre én ezt nem nevezném következetlenségnek, inkább egy (szerintem hasznos) nyelvi elemnek/lehetőségnek.
...viszont SZVSZ absozlút következetlen, hiszen egy sima metódus hívás esetén nem áll rendelkezésedre ez a lehetőség. Másrészt szerintem programozás technikailag is elég fura elgondolás, egy függvény kapja meg minden függőségét a paraméterein keresztül.

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.
Nem biztos, hogy ezt egy elég kétes nyelvi lehetőség segítségével érdemes elérned, ami picit a véletlen műve, ráadásul nem is kefejező a programot értelmezni próbáló személy számára.

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ő
7

call_user_func_array?

vbence · 2007. Feb. 25. (V), 00.57
Mi lenne, ha átadnád neki paraméterként? Gondolom, a $this, mint paraméternév nem érvényes, de $Elemér még lehet.. :) És akkor ugyanúgy eléred a hívó objektumot.