Saya sudah menginstall PHP 5.2 di salah satu komputer pengujian saya hari ini dan beberapa potongan kode yang sebelumnya bekerja dengan baik dalam versi 5.1.6 melemparkan kesalahan fatal dalam versi baru. Pesan kesalahan adalah "tingkat Nesting terlalu dalam - recursive ketergantungan?"Dan butuh sedikit waktu
Dalam PHP ada dua operator perbandingan, === == Dan. Ini umumnya diketahui bahwa yang pertama tidak ketat tentang jenis tetapi yang kedua adalah. Begitu, misalnya
gema ( == palsu 0 ); // benar
gema ( === palsu 0 ); // palsu
- 0 adalah integer dan palsu adalah sebuah boolean
Masalah saya timbul dari penggunaan non-ketat mengetik dengan objek.
$a = new MyObj();
$b = new MyObj();
jika( $a == $b )
…
Aku tidak dianggap apa yang saya lakukan dengan kode ini. Ketika membandingkan dua objek menggunakan operator perbandingan non-ketat (==) PHP membandingkan semua properti dari objek dan jika mereka cocok dengan objek yang dianggap sama. Jika mereka tidak cocok mereka tidak sama. Sebenarnya, kami memiliki perbandingan rekursif dari semua sifat setiap objek, dan semua mereka sifat, dan lain-lain. sampai kita mencapai tipe data dasar seperti string dan integer.
If, namun, kami menggunakan perbandingan yang ketat (===), PHP akan memeriksa apakah dua benda yang persis objek yang sama, bukan hanya benda dengan sifat yang sama.
kelas MyObj
{
public $ p;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
gema ( $a == $c ); // palsu
gema ( $a == $b ); // benar
gema ( $a === $b ); // palsu
Masalah muncul jika Anda telah referensi lingkaran pada objek Anda properti. Begitu, misalnya
kelas MyObj
{
public $ p;
}
kelas OtherObj
{
public $ q;
}$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->q = $ a; // referensi melingkar: $a->p->Q $ a ===$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ c;// referensi lain melingkar: $c->p->q $ c ===gema ( $a == $c ); // Fatal error:
Nesting terlalu dalam tingkat – rekursif ketergantungan?
Dalam rangka untuk membandingkan $ a menjadi $ c, PHP harus membandingkan sifat mereka. Jadi, logika dalam PHP berlangsung seperti ini: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->p dll. tanpa batas.
PHP 5.1 tampaknya mulus atas masalah entah bagaimana (mungkin setelah tingkat tertentu rekursi itu hanya kembali palsu) – dan biasanya itu berhasil baik-baPHPsaja. PHP 5.2 benar menghasilkan kesalahan fatal di atas.
Setelah Anda mengetahui masalah, solusinya adalah mudah – menggunakan perbandingan yang ketat.
gema ( $a === $c ); // palsu (dan tidak ada kesalahan)
Perbandingan ketat hanya akan memeriksa apakah kedua benda berada di lokasi yang sama di memori dan bahkan tidak melihat nilai dari sifat.
NB. Masalah yang sama dapat muncul ketika menggunakan operator perbandingan dinegasikan (menggunakan !== Bukan !=) dan bila menggunakan in_array (Parameter ketiga digunakan untuk menunjukkan in_array perbandingan ketat).
