Olen asentanut PHP 5.2 yksi minun testaus tietokoneiden tänään ja pari bittiä koodiin aiemmin toimi hienosti versio 5.1.6 heitti vakavat virheet uudessa versiossa. Virheilmoitus oli "sisäkkäin taso liian syvä - rekursiivinen riippuvuus?"Ja se vei vähän aikaa
PHP on kaksi vertailu operaattorit, == Ja ===. On yleisesti tiedossa, että ensimmäinen ei ole tarkka tyyppi, mutta toinen on. Niin, esimerkiksi
kaiku ( false == 0 ); // totta
kaiku ( vääriä === 0 ); // väärä
- 0 on kokonaisluku ja väärä on boolean
Minun ongelmani johtuivat ei-tiukka kirjoittamalla esineillä.
$= uusi MyObj();
$b = new MyObj();
jos( $== $ b )
…
En ollut katsoa, mitä olin tekemässä tätä koodia. Kun verrataan kahta esineitä kuin tiukkaan vertailuun operaattori (==) PHP vertaa kaikkien kohteiden ominaisuuksia ja jos ne vastaavat esineet pidetään yhtä. Jos ne eivät täsmää ne eivät ole yhtä. Voimassa, Olemme rekursiivinen vertaillaan kaikkia ominaisuuksia kunkin kohteen, ja kaikki niiden ominaisuudet, jne.. kunnes pääsemme perustiedot tietotyyppejä kuten merkkijonoja ja kokonaislukujen.
Jos, kuitenkin, käytämme tiukkoja vertailu (===), PHP tarkistaa onko kahden objektin ovat täsmälleen sama tarkoitus, ei vain esineitä, joilla on samat ominaisuudet.
luokka MyObj
{
julkinen $ p;
}$= uusi MyObj();
$b = new MyObj();
$c = new MyObj();
$->p = 1;
$b->p = 1;
$C->p = 2;
kaiku ( $== $ c ); // väärä
kaiku ( $== $ b ); // totta
kaiku ( $=== $ b ); // väärä
Ongelma syntyy, jos olet kehäviittauksia sinun objektien ominaisuuksia. Niin, esimerkiksi
luokka MyObj
{
julkinen $ p;
}
luokka OtherObj
{
julkinen $ q;
}$= uusi MyObj();
$b = new OtherObj();
$->p = $ b;
$b->$ = Q; // kehäviittauksen: $->p->=== Q $$c = new MyObj();
$d = new OtherObj();
$C->p = $ d;
$d->q = $ c;// toinen kehäviittauksen: $C->p->q $ c ===kaiku ( $== $ c ); // Kohtalokas virhe:
Pesiä Liian syvälle – rekursiivinen riippuvuus?
Jotta verrata $ ja $ c, PHP on vertailla niiden ominaisuuksia. Joten logiikka PHP menee jotain tällaista: $== $ c jos $->p == $c->p jos $->p->q == $ c->p->q jos $->p->q->p == $ c-->p-->Q->p jne.. toistaiseksi.
PHP 5.1 näytti tasoittaa ongelman jotenkin (luultavasti kun tietty määrä rekursio yksinkertaisesti palautetaan false) – ja yleensä se toimi pois sakkoPHPHP 5.2 oikein tuottaa kohtalokas virhe edellä.
Kun tiedät ongelman, Ratkaisu on helppo – Käytä tiukkaa vertailu.
kaiku ( $=== $ c ); // väärä (eikä virhe)
Tiukkaan vertailuun yksinkertaisesti tarkistaa, ovatko nämä kaksi esineet ovat samassa paikassa muistiin ja niin ei edes tarkastella arvot ominaisuuksien.
Huom. Sama ongelma voi ilmetä, kun käytät tyhjäksi vertailu toimijoiden (käyttö !== Sijasta !=) ja käytettäessä in_array (käyttää in_array kolmas parametri ilmoittaa tiukkaan vertailuun).
