Ive 'beiktatott PHP 5.2 az egyik az én-m vizsgálat számítógépek ma és pár bit a kód, amely a korábban működött a változat 5.1.6 dobta végzetes hiba az új verzió. A hibaüzenet: "Fészekrakó szinten túl mély - rekurzív függőség?"És ez elvitt egy kis időt
PHP-ben két összehasonlító operátorok, == És ===. Ez közismert, hogy az első nem szigorúak típus, de a második. Így, például
visszhang ( == false 0 ); // igaz
visszhang ( false === 0 ); // hamis
- 0 egész szám, és hamis a logikai
Az én problémám okozta használó, szigorú gépelést tárgyak.
$1 = új MyObj();
$b = new MyObj();
ha( $a == $ b )
…
Én nem vizsgálta, mit csinálok ezzel a kóddal. Ha összehasonlítjuk a két használati tárgyakat nem szigorú összehasonlító operátor (==) PHP hasonlítja össze mindazokat a tulajdonságokat, a tárgyak, és ha azok megegyeznek a tárgyak egyenlőnek tekintik. Ha ezek nem egyeznek meg, hogy nem azonos. Gyakorlatilag, van egy rekurzív összehasonlítása minden egyes objektum tulajdonságait, és minden tulajdonságaik, stb. amíg el nem érjük az alapvető adattípusok, mint a húrok, és egész.
Ha, viszont, az általunk használt szigorú összehasonlítás (===), PHP ellenőrzi, hogy a két objektum pontosan ugyanezt a célt, nem csak objektumok ugyanazokkal a tulajdonságokkal.
osztály MyObj
{
public $ p;
}$1 = új MyObj();
$b = new MyObj();
$c = new MyObj();
$A->p = 1;
$b->p = 1;
$c->p = 2;
visszhang ( $a == $ c ); // hamis
visszhang ( $a == $ b ); // igaz
visszhang ( $a === $ b ); // hamis
A probléma merül fel, ha a körkörös hivatkozásokat a tárgyak tulajdonságait. Így, például
osztály MyObj
{
public $ p;
}
osztály OtherObj
{
public $ q;
}$1 = új MyObj();
$b = new OtherObj();
$A->p = $ b;
$b->q = $ a; // A körkörös hivatkozás: $A->p->=== Q $ a$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ c;// egy körkörös hivatkozás: $c->p->q $ c ===visszhang ( $a == $ c ); // Végzetes hiba:
Fészkelő szinten túl mély – rekurzív függőség?
Összehasonlítása érdekében, hogy a $ $ c, PHP összehasonlítják tulajdonságaik. Tehát a logika PHP-ben megy valami ilyesmi: $a == $ c $, ha a->p == $c->o ha $->p->q == $ c->p->q ha $->p->q->pp == $ c-gt;p->q->p stb.. határozatlan időre.
PHP 5.1 látszott, hogy elsimítani a problémát valahogy (Valószínűleg egy bizonyos szintű rekurzió egyszerűen vissza false) – és általában is dPHPozott ki bírságot. PHP 5.2 helyesen állítja elő a végzetes hiba a fenti.
Ha már tudja a problémát, A megoldás egyszerű – Szigorú összehasonlítás.
visszhang ( $a === $ c ); // hamis (és nem hiba)
A szigorú összehasonlítás egyszerűen ellenőrzi, hogy a két objektum van ugyanazon a helyen a memóriában, és ezért nem is néz az értékek az ingatlanok.
NB. Ugyanez a probléma merülhet fel, ha az megfosztani összehasonlító operátorok (használat !== Helyett !=) és mikor használ in_array (használata in_array harmadik paraméter jelzi szigorú összehasonlítás).
