Autor Zpráva
halogan
Profil
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
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
Dero: k prvnimu - kdyz vytahne hodnotu, proc by se podminka empty mela splnit jako true?
Dero
Profil
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

error_reporting(E_ALL);
class Foo {

private $bars = Array("foo" => "bar", "bar" => "foo");

function __get($bar)
{
return $this->bars[$bar];
}

}

$c = new Foo;
$foo = $c->bar;
if (empty($foo)) {
print "foo";

} else {
print "bar";
}

$foo = $c->xyz;
if (empty($foo)) {
print "foo";
} else {
print "bar";
}
?>
halogan
Profil
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
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
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
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
priamym získavaním som myslel niečo v zmysle
$abc=$c->bar
xixli
Profil
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
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
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
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
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) {

return 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
dgx
Profil
pozor na ten ampersand, function my_empty(&$var) neexistující proměnnou vytvoří
Toto téma je uzamčeno. Odpověď nelze zaslat.