3

実行せずに答える質問がありました。

class Foo {
    public $x;
}
$a = new Foo();
$b = new Foo();
$a->x = $b;
$b->x = $a;

print_r($a == $b);

これは1を出力するはずだと思いましたが、実行すると致命的なエラーが発生しました。

Fatal error: Nesting level too deep - recursive dependency? on line 13

なぜこのエラーが発生するのか誰かが説明できますか?

4

2 に答える 2

4

PHPがオブジェクトを比較する方法のため。

オブジェクトをと比較すると==、PHPは各オブジェクトの各プロパティ(および一部のプロパティに他のオブジェクトが含まれている場合はネストされたオブジェクト)を調べて比較します。すべてのプロパティが等しい場合、オブジェクトは等しいと見なされます。

この特定のケースでは、オブジェクトを互いのプロパティ内に配置しているため、比較エンジンがループ($a->b->a->b->a->b->...)し、エラーがスローされます。

于 2012-11-13T12:02:58.937 に答える
1

PHPは、参照が等しいかどうかではなく、オブジェクトが等しいかどうかを調べようとします。これを評価するために、オブジェクトは完全にトラバースされます。このトラバーサルには、他のオブジェクトを指す参照が含まれます。だからあなたは無限ループを実装しました...

于 2012-11-13T12:03:23.507 に答える