PHP5 RC3 __set() és __get() tagfüggvények
Egy érdekes dologgal találkoztam a php5 rc3-ban a __set() és __get() tagfüggvényekkel kapcsolatban. Egy példakódot copy-paste -eltem az alábbi címről
http://zend.com/manual/migration5.oop.php
és a kód itt van külön
http://www.universale.hu/test.php.txt -ben.
Amikor kiegészítettem a példakódot az alábbi sorral, hogy print $foo->x["a"]++; Akkor a __set() és __get() függvények nem hívódtak meg, ellenben a $foo->a++; esetben amikor meghívódtak és a $foo->x["a"]-ra. Az nem világos, hogy miért nem hívódnak meg ilyenkor (esetleg bug)?
Köszönettel előre is minden választ
Szép László
■ http://zend.com/manual/migration5.oop.php
és a kód itt van külön
http://www.universale.hu/test.php.txt -ben.
Amikor kiegészítettem a példakódot az alábbi sorral, hogy print $foo->x["a"]++; Akkor a __set() és __get() függvények nem hívódtak meg, ellenben a $foo->a++; esetben amikor meghívódtak és a $foo->x["a"]-ra. Az nem világos, hogy miért nem hívódnak meg ilyenkor (esetleg bug)?
Köszönettel előre is minden választ
Szép László
Re: PHP5 RC3 __set() és __get() tagfüggvények
Ha a példaprogit lefutattom, akkor a $foo->n = 1; utasításnál sem futott le a __set() függvény, ebből arra gondolok, hogy csak akkor fut le, ha olyan attributumra hivatkozunk, ami nem létezik, és mikor te a $foo->x -re hivatkozol, akkor az létezik.
De ez inkább csak vaktába tapogatozás...
Mindenesetre nem láttom azt a problémát, amit ezzekkel kellene megoldani. :)
Csak kiváncsiság
Szerintem is akkor fut le a set amikor nem létezik az attribútum, de akkor meg a gondom az, hogy $foo->s++; utasításnál a $foo->s nem létezik lefut és azt mondja 'Setting [s] to 1 Not OK!'. Viszont $foo->a=100; -nál $foo->a ugyanúgy nem létezik lefut de ekkor pedig nem ezt mondja hogy 'Setting [s] to 100 Not OK!', hanem hogy 'Setting [a] to 100 OK!' és $foo->x["a"] -t 100-ra állítja, pedig erről az attribútumról szó sincs:). Sőt utána amikor még mindig nem létezik a $foo->a attribútum (a var_dump() szerint sem), a $foo->a++ utasításnál lefut a set és a get és azt mondja hogy 'Getting [a] Returning: 100 Setting [a] to 101 OK!' (itt s $foo->x["a"]-t változtatja ismét!). Akkor a set-nél ez azt jelenti, hogy a $foo->a nem létezik hiszen lefut, de ha nem létezik akkor a get hogyan ad 100-t vissza a set előtt?
Ha $foo->a pedig ekvivalens $foo->x["a"]-val az pedig furcsa lenne... ( de lehet hogy csak nem olvastam még ezzel kapcsolatban semmit )Szóval már nekem is logikátlan az egész :D
Re: Csak kiváncsiság
a set/get megnézi, hogy a
$this->x[valami]
létezik-e, és ez alapján írja ki, hogy sikerült a x[valami] írása/olvasása.$foo->s = 1;
ennél az utasításnál a $foo->s nem létezése miatt fut le a set, majd mivel a $x tömbnek nincs "s" indexe ezért írja ki a Not OK! -t.Ellenben a
$foo->a = 1;
utasításnál a $foo->a nem létezése miatt fut le a set, majd mivel a $x tömbnek van "a" indexe ezért írja ki a OK! -t. Majd a $x['a']-t írja át 1-re.Végül
$foo->n = 1;
esetben létezik n attribum, így a set nem is fut le. (és szerintem ez itt bug, vagy egy olyan feature, aminek nem láttom az értelmét)__get(), __set() értelme...
Így már világosabb
Ilyen ötlete volt :)
Re: __get(), __set() értelme...
Az persze világos, hogy van értelme, nem is akartam írni a bugreportra, de biztos vagyok benne, hogy én ilyet nem használnék.
(talán a __get() -be egy warrning, __set() -be error :)
egy feladat - sok megoldás
SimpleXML
Megvilágosodás
Szia! [i]Lehet, hogy csak
Ez is egy olyan lehetoseg, amit lehet jol es rosszul hasznalni. Konnyen elkepzelhetoek olyan szituaciok, amikor hasznos tud lenni. Ott van a Goba altal emlitett eset, de peldaul egy RecordSet eseten is milyen jol jon majd. Nem kell ezt irogatno: $rs->fields['x'], helyette $rs->x.
Igazabol a gond az oroklodes kapcsan jon majd elo az ezen lehetoseget hasznalo osztalyok eseten. Ha egy osztaly hasznalja a __set/get lehetosegeket, es az ot kiterjeszto osztaly is szeretne ilyen "tagvaltozokat" hasznalni, akkor ugy kell a sajat __set/get mwetodusait megirni, hogy a szulo __set/get metodusai feladatat is ellatsa. Tehat a leszarmazott osztaly "jobban" kell ismerje a szulo osztaly mukodeset, mint normal esetben.
Felho