Autor | Zpráva | ||
---|---|---|---|
halogan Profil |
#1 · Zasláno: 20. 11. 2005, 22:41:18
Dobrý den,
omlouvám se za OT, ale bude to jen jednou. Nebude to hádanka jako od dgx či Reného Steina, ale dle mého soudku zajímavá. Řekněte mi, co se vypíše po spuštění tohoto scriptu? Zvědavci mohou odstranit "s" a přesvědčit se. Byl bych rád, kdybyste svou odpověd odůvodnili. Příjemnou zábavu. |
||
Dero Profil |
#2 · Zasláno: 20. 11. 2005, 22:49:13
foofoo?
V prvním případě pracuje nativní getter a vytáhne hodnotu pro "bar" z asociativního pole (což je "foo"), v druhém pak xyz není definováno a na základě podmínky se printuje zase "foo". Podotýkám, že s objekty v PHP5 nepracuji (zatím jsem si vystačil s PHP4), takže je dost dobře možné, že plácám naprosté kraviny. |
||
halogan Profil |
#3 · Zasláno: 20. 11. 2005, 23:26:05
Dero: k prvnimu - kdyz vytahne hodnotu, proc by se podminka empty mela splnit jako true?
|
||
Dero Profil |
#4 · Zasláno: 20. 11. 2005, 23:37:00 · Upravil/a: Dero
halogan: No IMHO protože empty($c->bar) hledá přednostně proměnnou $bar deklarovanou v rámci třídy Foo, kterou však nenachází a vyhodnotí výraz jako true bez ohledu na getter. Nevím, jestli to je feature nebo chyba, jsem jen tupý kodér.
Každopádně takhle to fungovat bude určitě: <?php |
||
halogan Profil |
#5 · Zasláno: 20. 11. 2005, 23:53:59
Dero: Ja se totiz z nekoho snazim dostat dukaz, proc to tak dela. Logicky by to totiz melo vypsat "barfoo", pujdu se kouknout na bugs.php.net. Jde mi o to, zda vubec __get pouzivat, pokud je zde takova "chyba".
|
||
halogan Profil |
#6 · Zasláno: 20. 11. 2005, 23:57:03
Bez ztrapneni jsem se mohl odporoucet na bugs.php.net, vyhledat "__get empty" a odpovedi by se mi dostalo behem par minut:
"Thank you for taking the time to write to us, but this is not a bug." |
||
Dero Profil |
#7 · Zasláno: 21. 11. 2005, 00:06:01
halogan: No vidíš, a je to jasné. Funguje to nějak tak, jak jsem si myslel. A mimochodem, taky si myslím, že by to měl být bug. :o)
|
||
xixli Profil |
#8 · Zasláno: 21. 11. 2005, 17:47:50
To nie je bug. Totižto __get() sa tuším volá iba pri priamom získavaní premennej z objektu:
skús si do __get() napísať echo "ano"; - nevolá sa. Teda sa aplikácia chová akoby tam __get() nebolo. $c->bar je empty (NULL) a takisto $c->xyz |
||
xixli Profil |
#9 · Zasláno: 21. 11. 2005, 17:48:38
priamym získavaním som myslel niečo v zmysle
$abc=$c->bar |
||
xixli Profil |
#10 · Zasláno: 21. 11. 2005, 17:50:07 · Upravil/a: xixli
a tuná to funguje správne
<?php error_reporting(E_ALL); class Foo { private $bars = Array("foo" => "abc", "bar" => "xyz"); function __get($bar) { echo "ano"; return $this->bars[$bar]; } } $c = new Foo; foo($c->bar); function foo($value) { echo $value; } ?> |
||
halogan Profil |
#11 · Zasláno: 21. 11. 2005, 22:22:35
A proc by se echo v __get melo volat? Metoda __get se vola jen v pripade ziskavani promenne, ktera neexistuje nebo neni pristupna, tudiz zadne echo. Mne nejde o vypsani te promenne, to je trivialni, jde mi o testovani hodnoty.
|
||
xixli Profil |
#12 · Zasláno: 22. 11. 2005, 16:17:00 · Upravil/a: xixli
skúsil som trošku hľadať: [url=http://sk.php.net/empty#55966
]http://sk.php.net/empty#55966 [/url] alebo http://bugs.php.net/bug.php?id=28176 empty teda hľadá v premenných objektu a kašle na __get |
||
halogan Profil |
#13 · Zasláno: 22. 11. 2005, 23:14:11
xixli: Uz vyse pisu, ze jsem to nasel na bugs.php.net a neboj, vsechny tyhle bugy mam prectene. Ad php.net - z toho jsem vychazel.
|
||
llook Profil |
#14 · Zasláno: 23. 11. 2005, 14:09:52
Empty je jazyková konstrukce a chová se jinak než funkce. Taky mi to připadá krapet nedomyšlený, ale dá se s tím žít. Pokud chceš testovat přetížené vlastnosti, vytvoř si funkci, třeba my_empty, a tu používej místo empty:
function my_empty(&$var) { Schválně zkus :%s/empty/my_empty/g, dostaneš očekávaný výsledek: bar Notice: Undefined index: xyz in /var/www/htdocs/test.php on line 9 foo |
||
Časová prodleva: 6 měsíců
|
|||
dgx Profil |
#15 · Zasláno: 8. 5. 2006, 18:24:34
pozor na ten ampersand, function my_empty(&$var) neexistující proměnnou vytvoří
|
||
Časová prodleva: 19 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0