Ég hef sett upp PHP 5.2 á einn af tölvum próf mitt í dag og núna af bits af kóða sem áður starfaði fínn í útgáfa 5.1.6 kastaði banvæn villa í the nýr útgáfa. The villa skilaboð voru "hreiður stigi of djúpur - endurkvæma ánauðar?"Og það tók smá tíma
Í PHP eru tveir saman rekstraraðila, == Og ===. Það er almennt vitað að fyrri er ekki strangur um tegund en öðrum er. Svo, td
echo ( falskur == 0 ); // sannur
echo ( falskur === 0 ); // rangar
- 0 er heiltala og falskur er Boolean
Vandamálið mitt reis frá því að nota ekki strangur slá með hluti.
$a = new MyObj();
$b = new MyObj();
ef( $a == $b )
…
Ég hafði ekki talið það sem ég var að gera með þennan kóða. Við samanburð á tveimur hlutum með því að nota ekki strangar miðað rekstraraðila (==) PHP saman allar eignir á hlutum og ef þeir passa hlutir eru taldar vera jöfn. Ef þeir passa að þeir eru ekki jafn. Í raun, við höfum endurkvæma samanburð á öllum þeim eiginleikum sem hver hlutur, og allar eignir þeirra, etc. þangað til við náum grunnupplýsingar tegundir eins og band og heiltölur.
If, Hins vegar, við notum ströngum samanburði (===), PHP mun athuga hvort tveggja hluta eru nákvæmlega sama hlut, ekki bara hlutir með sömu eiginleika.
bekk MyObj
{
opinber $ p;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
echo ( $a == $c ); // rangar
echo ( $a == $b ); // sannur
echo ( $a === $b ); // rangar
Vandamálið kemur upp ef þú ert með hringlaga tilvísanir í hluti þinn eignir. Svo, td
bekk MyObj
{
opinber $ p;
}
bekk OtherObj
{
opinber $ q;
}$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->q = $ a; // hringlaga tilvísun: $a->p->=== Q $ a$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ c;// annað hringlaga tilvísun: $c->p->q $ c ===echo ( $a == $c ); // Banvæn villa:
Nesting level too deep – endurkvæma ánauðar?
Í því skyni að bera $ a í $ c, PHP verður að bera saman eiginleika þeirra. Þannig að röksemdafærsla í PHP fer eitthvað eins og this: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->p etc. endalaust.
PHP 5.1 virtist slétt yfir vandamál einhvern veginn (líklega eftir a viss láréttur flötur af Endurkvæmt fall það skilaði einfaldlega rangar) – og það venjulega í uppnámi út fínn. PHP 5.2 rétt framleiðir um banvæn villa fyrir ofan.
Þegar þú veist hvað vandamálið, lausnin er auðvelt – nota ströng samanburður.
echo ( $a === $c ); // rangar (og engin villa)
The strangur samanburður verður einfaldlega að athuga hvort tveggja hlutir eru á sama stað í minni og því ekki jafnvel líta á gildi eiginleika.
NB. Sama vandamál geta komið upp þegar þú notar negated samanburður rekstraraðila (nota !== Stað !=) og þegar in_array (þriðju breytu nota in_array að benda á ströngum samanburði).
