Ive 'instaliran PHP 5.2 na jedan od mojih testiranje računala danas i nekoliko bitova koda koji je prethodno radio u redu verzija 5.1.6 bacio fatalne pogreške u novoj verziji. Poruka o pogreški je "gniježdenje razini previše duboko - recursive ovisnosti?"I to je uzeo malo vremena
U PHP-u postoje dva operatora usporedbe, == I ===. Općenito je poznato da je prvi nije stroga o vrsti, ali drugi je. Tako, for example
jeka ( == false 0 ); // istinit
jeka ( false === 0 ); // lažan
- 0 je cijeli broj, a lažno je Boolean
Moj problem je nastao sa primjenom ne-strogi tipkanje s objektima.
$a = new MyObj();
$b = new MyObj();
ako( $a == $b )
…
I nije smatrao ono što sam radio sa ovim kod. Prilikom usporedbe dva objekta pomoću ne-strogi operator usporedbe (==) PHP uspoređuje sva svojstva objekata i ako oni odgovaraju predmetima smatraju se jednako. Ako oni ne odgovaraju oni nisu jednaki. Ustvari, imamo usporedbu rekurzivnih svih svojstava svakog objekta, i sva njihova svojstva, dr.. dok ne stignemo osnovnih tipova podataka kao što su cijeli brojevi i nizovi.
If, međutim, koristimo stroge usporedbu (===), PHP će provjeriti jesu li dva objekta su potpuno isti objekt, ne samo predmeti s istim svojstvima.
klasa MyObj
{
javne $ p;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
jeka ( $a == $c ); // lažan
jeka ( $a == $b ); // istinit
jeka ( $a === $b ); // lažan
Problem nastaje ako ste kružne reference na svoje objekte nekretnine. Tako, for example
klasa MyObj
{
javne $ p;
}
klasa OtherObj
{
javne $ q;
}$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->$ q =; // kružne reference: $a->p->=== Q $$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ c;// drugi kružne reference: $c->p->q $ C ===jeka ( $a == $c ); // Fatalna pogreška:
Gniježdenje razini preduboko – rekurzivna ovisnosti?
Da bi se usporediti s $ $ c, PHP moraju usporediti njihova svojstva. Dakle logika u PHP-u ide otprilike ovako: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->p itd. neodređeno.
PHP 5.1 kao da se preko glatke problem nekako (vjerojatno nakon određene razine rekurzije to jednostavno vratio lažne) – i obično je izrađen prekid. PHPHP.2 ispravno proizvodi fatalna pogreška gore.
Jednom kada znate problema, rješenje je jednostavno – pridržavat usporedbu.
jeka ( $a === $c ); // lažan (i nema pogreške)
Strogom usporedba jednostavno će provjeriti da li su dva objekta na istoj lokaciji u memoriju i tako ni ne pogledamo vrijednosti nekretnina.
NB. Isti problem može nastati pri korištenju odbačena usporedbe operaterima (koristiti !== Umjesto !=) and when using in_array (koristiti in_array treći parametar za označavanje strogi usporedbu).
