Aš įjungiau PHP 5.2 vienas iš mano bandymų kompiuterių šiandien ir iš bitų kodas, kuris anksčiau dirbo baudą versija poros 5.1.6 retai mirtinų klaidų naujoje versijoje. Klaidos pranešimas buvo "įdėties lygį per giliai - rekursinis priklausomybę?"Prireikė nedaug laiko
PHP yra du palyginimo operatorių, == === Ir. Tai visuotinai žinoma, kad pirmieji nėra griežtų apie rūšį, bet antra. Taip, pavyzdžiui
aidas ( melagingą == 0 ); // tiesa
aidas ( melagingą === 0 ); // klaidingas
- 0 yra sveikasis skaičius ir klaidingų yra boolean
Mano problema atsirado naudojant ne griežtas rašyti su objektai.
$a = new MyObj();
$b = new MyObj();
jeigu( $a == $b )
…
Aš nemanė ką darau šią kodas. Lyginant dviejų objektų, naudojant ne griežtu palyginimu operatorius (==) PHP lygina visų daiktų savybes ir, jei jie atitinka objektai laikoma lygia. Jei jie nesutampa jie nėra lygūs. Iš tikrųjų, mes rekursinis palyginti visų kiekvieno objekto savybes, ir visi jų savybės, ir tt. kol pasiekiame pagrindinių duomenų rūšių, pavyzdžiui, styginiams ir sveikųjų skaičių.
If, tačiau, mes naudojame griežtas palyginimas (===), PHP patikrins, ar šie du objektai yra lygiai tokio paties objekto, ne tik objektus su tos pačios savybės.
klasė MyObj
{
public $ p;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
aidas ( $a == $c ); // klaidingas
aidas ( $a == $b ); // tiesa
aidas ( $a === $b ); // klaidingas
Problema kyla, jei turite nelogiškų nuorodų į savo objektų savybės. Taip, pavyzdžiui
klasė MyObj
{
public $ p;
}
klasė OtherObj
{
public $ q;
}$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->q = $; // ciklinę nuorodą: $a->p->=== Q $$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ c;// kitoje ciklinę nuorodą: $c->p->q $ c ===aidas ( $a == $c ); // Fatal error:
Nesting level too deep – rekursinis priklausomybę?
Siekiant palyginti $ $ c, PHP turi lyginti jų savybės. Taigi PHP logika jis skamba maždaug taip: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->p ir tt. neribotą laiką.
PHP 5.1 Atrodė, užglostyti problema kažkaip (tikriausiai po tam tikro lygio rekursija jis tiesiog grąžinamas false) – ir paprastai viskas išėjo gerai. PHP 5.2 teisingai gamina lemtinga klaida pirmiau.
Kai žinote, problema, tirpalas yra lengvai – Naudoti griežtai palyginimas.
aidas ( $a === $c ); // klaidingas (ir ne klaida)
Griežtu palyginimu tiesiog patikrinti, ar šie du objektai yra toje pačioje vietoje atminties ir todėl nėra net pažvelgti į savybių vertybinė išraiška.
NB. Ta pati problema gali kilti naudojantis išnykti Palyginimo operatoriai (naudoti !== Vietoj !=) ir naudojant in_array (naudoti in_array trečias parametras rodo griežtu palyginimu).
