私はPHPをインストールしている 5.2 私のテストコンピュータで、今日、以前のバージョンでの罰金を働いたのコードのビット数 5.1.6 新しいバージョンで致命的なエラーを投げた. エラーメッセージが表示された"ネストレベルが深すぎる - 再帰的な依存関係?"とは少し時間がかかりました
PHPでは、2つの比較演算子は, ==と===. これは、一般的には、最初の知られているタイプについての厳しいが、2番目はされていません. そう, 例えば
エコー ( 偽== 0 ); // 真
エコー ( 偽=== 0 ); // 偽
- 0 整数とfalseはbooleanです
私の問題は、オブジェクトの非厳密な入力を使用して生じた.
$=新しいMyObjの();
$b =新しいMyObjの();
場合( $== $ bに )
…
私は私がこのコードでやっていたと考えていなかった. を比較するとき2つのオブジェクトは、非厳密な比較演算子を使用して (==) PHPは、もし彼らがオブジェクトに一致する等しいとみなされているオブジェクトのすべてのプロパティを比較する. 彼らは同じではありませんが一致しない場合. 実際には, 我々は、各オブジェクトのすべてのプロパティの再帰的な比較をして, とそのすべてのプロパティ, 等. 我々は文字列と整数のような基本データ型に到達するまで.
場合, しかしながら, 我々は厳密な比較を使用して (===), PHPはどうか2つのオブジェクトは同じオブジェクトであることを確認します, 同じプロパティを持つだけでなく、オブジェクト.
クラスMyObjの
{
$公共p;
}$=新しいMyObjの();
$b =新しいMyObjの();
$C =新しいMyObjの();
$ - >p = 1;
$B->p = 1;
$C->p = 2;
エコー ( $== $ C ); // 偽
エコー ( $== $ bに ); // 真
エコー ( $=== $ bに ); // 偽
あなたがプロパティを、オブジェクトの循環参照がある場合、問題が発生. そう, 例えば
クラスMyObjの
{
$公共p;
}
クラスOtherObj
{
$ qを公開;
}$=新しいMyObjの();
$b =新しいOtherObj();
$ - >p = $ b;
$B->はq = $; // 循環参照: $ - >P->===は$ qを$C =新しいMyObjの();
$D =新しいOtherObj();
$C->p = $ d個の;
$D->はq = $ cに;// 別の循環参照: $C->P->qは$ cに===エコー ( $== $ C ); // 致命的なエラー:
ネストレベルが深すぎます – 再帰依存?
ために$を$比較をc, PHPは、そのプロパティを比較する必要があります. PHPのロジックが行くので、このような: $== $ C $であれば、>p == $c->点P $>p->Q == $ C->p-> - $場合、Q>p->P ==ます$ c-==P-c->p->Q->p等. 無期限に.
PHP 5.1 この問題を何とか上に滑らかにするよう (再帰のそれは単にfalseが返された特定のレベルはおそらく後) – とはPHP常、罰金を働いて. PHP 5.2 正しく上記の致命的なエラーを生成する.
一度問題を知っている, 解決策は簡単です – 厳密な比較を使用して.
エコー ( $=== $ C ); // 偽 (とエラー)
厳密な比較は、単にかどうかを2つのオブジェクトは、メモリ内の同じ位置であるので、プロパティでさえもの値を見ていない確認します.
注意. 同じ問題は、否定の比較演算子を使用して発生する可能性 (使用 !==の代わりに !=) 時例えばin_arrayを使用して (使用場合のin_array 3番目のパラメータは、厳密な比較を示すために).
