Olen installinud PHP 5.2 üks minu katsetamine arvutid täna ja paar bitti kood, mis varem töötas trahvi versioon 5.1.6 viskas fataalne vigu uus versioon. Veateade oli "pesastamistaset liiga sügav - recursive sõltuvuse?"Ja ta võttis vähe aega
PHP on kaks võrdlus ettevõtjad, == Ja ===. On üldteada, et esimene ei ole range umbes liiki, kuid teine on. Nii, for example
kaja ( vale == 0 ); // tõsi
kaja ( vale === 0 ); // vale
- 0 on täisarv ja vale on boolean
Minu probleem tekkis mitte-range kirjutamaõppimine objektid.
$a = new MyObj();
$b = new MyObj();
kui( $a == $b )
…
Ma ei mõelnud, mida ma tegin selle koodi. Kui võrrelda kahe objektide, mis kasutavad vähem range võrdlusmärk (==) PHP võrdleb kõik omadused objektid ja kui need sobivad esemed loetakse võrdseks. Kui nad ei sobi nad ei ole võrdsed. Tegelikult, meil on rekursiivne võrrelda kõiki omadusi iga objekti, ja kõik nende omadused, jne. kuni jõuame põhiandmed tüübid nagu stringid ja täisarvud.
If, siiski, me kasutame range võrdlus (===), PHP kontrollib, kas need kaks objekti on täpselt sama eesmärk, mitte ainult objektid, samad omadused.
klassi MyObj
{
avaliku $ p;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
kaja ( $a == $c ); // vale
kaja ( $a == $b ); // tõsi
kaja ( $a === $b ); // vale
Probleem tekib, kui teil on ümmarguse viiteid teie objekti omadused. Nii, for example
klassi MyObj
{
avaliku $ p;
}
klassi OtherObj
{
avaliku $ q;
}$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->q = $; // ümmarguse viide: $a->p->=== Q $$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ c;// teine ringkiri viide: $c->p->q $ c ===kaja ( $a == $c ); // Saatuslik viga:
Pesastamistaset liiga sügavale – rekursiivne sõltuvuse?
Et võrrelda $ to $ c, PHP tuleb võrrelda nende omadusi. Nii et loogika PHP läheb midagi sellist: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->p jne. määramata ajaks.
PHP 5.1 näis sujuvat üle probleemi kuidagi (arvatavasti pärast teatava taseme rekursioon ta lihtsalt tagasi vale) – ja tavaliselt see toimis trahvi. PHPPHP2 õigesti toodab fataalne viga eespool.
Kui tead probleem, Lahendus on lihtne – kasutamise range võrdlus.
kaja ( $a === $c ); // vale (ja ühtegi viga)
Range võrdlus lihtsalt kontrollida, kas kaks objekti on samal asukohta mälus ja seega ei ole isegi pilk väärtused omadused.
NB. Sama probleem võib tekkida, kui kasutate olematuks võrreldes ettevõtjate (kasutamine !== Asemel !=) ja kasutamisel in_array (kasutamise in_array kolmas parameeter, mis näitab range võrdlus).
