Saya sudah memasang PHP 5.2 di salah satu komputer ujian saya hari ini dan beberapa potongan kod yang sebelumnya bekerja dengan baik dalam versi 5.1.6 melemparkan kesalahan fatal dalam versi baru. Mesej kesalahan adalah "tingkat Nesting terlalu dalam - recursive pergantungan?"Dan butuh sedikit waktu
Dalam PHP ada dua operator perbandingan, === == Dan. Ini umumnya diketahui bahawa yang pertama tidak ketat tentang jenis tetapi yang kedua adalah. Jadi, sebagai contoh
gema ( == Palsu 0 ); // benar
gema ( === Palsu 0 ); // palsu
- 0 adalah integer dan palsu adalah sebuah boolean
Masalah saya timbul daripada penggunaan non-ketat menaip dengan objek.
$MyObj baru =();
$b = baru MyObj();
kalau( $1 == $ b )
…
Aku tidak dianggap apa yang saya lakukan dengan kod ini. Ketika membandingkan dua objek menggunakan pembekal perbandingan bukan-ketat (==) PHP membandingkan semua hotel dari objek dan jika mereka berpadanan dengan objek yang dianggap sama. Jika mereka tidak berpadanan mereka tidak sama. Sebenarnya, kami mempunyai perbandingan rekursif dari semua sifat setiap objek, dan semua sifat mereka, dan lain-lain. sampai kita mencapai taip data asas seperti string dan integer.
Jika, namun, kami menggunakan perbandingan yang ketat (===), PHP akan memeriksa apakah kedua-dua objek objek yang sama persis, bukan hanya benda dengan sifat yang sama.
kelas MyObj
{
public $ p;
}$MyObj baru =();
$b = baru MyObj();
$c = baru MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
gema ( $1 == $ c ); // palsu
gema ( $1 == $ b ); // benar
gema ( $$ === b ); // palsu
Masalah muncul jika anda mempunyai rujukan melingkar di hotel tempat anda. Jadi, sebagai contoh
kelas MyObj
{
public $ p;
}
kelas OtherObj
{
public $ q;
}$MyObj baru =();
$b = baru OtherObj();
$a->p = $ b;
$b->q = $ a; // rujukan melingkar: $a->-p>Q $ a ===$c = baru MyObj();
$d = baru OtherObj();
$c->p = $ d;
$d->q = $ c;// rujukan lain melingkar: $c->-p>q $ c ===gema ( $1 == $ c ); // Fatal error:
Bersarang tahap terlalu dalam – rekursif pergantungan?
Dalam rangka untuk membandingkan $ a menjadi $ c, PHP harus membandingkan sifat mereka. Jadi, logik dalam PHP berlangsung seperti ini: $c == $ jika $ a->p == $c->p jika $ a->p->q == $ c->p->q jika $ a->p->p == $ c- == $c--pt;p->q->p dll. tanpa batas.
PHP 5.1 tampaknya mulus atas masalah entah bagaimana (mungkin selepas peringkat tertentu rekursi itu hanya kembali palsu) – dan biasanya itu berjaya baik-bPHP saja. PHP 5.2 benar menghasilkan kesalahan fatal di atas.
Selepas anda mengetahui masalah, solusinya adalah mudah – menggunakan perbandingan yang ketat.
gema ( $1 === $ c ); // palsu (dan tidak ada kesalahan)
Perbandingan ketat hanya akan memeriksa sama ada kedua-dua benda berada di lokasi yang sama di memori dan bahkan tidak melihat nilai dari sifat.
NB. Masalah yang sama dapat muncul ketika menggunakan pembekal perbandingan dinegasikan (menggunakan !== Bukan !=) dan apabila menggunakan in_array (Parameter ketiga digunakan untuk menunjukkan in_array perbandingan ketat).
