PHPオブジェクトが参照であるため、PHPで循環リンクリストを作成しようとしています。これは、php オブジェクトの動作が C++ ポインターに似ていることを意味します。以下は、リンクされたリストの単純化された実装です。
class Node{
public $next;
}
$node1 = new Node();
$node2 = new Node();
$node1->next = $node2;
$node2->next = $node1;
これを実装した後、オブジェクトを循環リストにリンクすると、おかしなことが起こり始めることに気付きました。たとえば、== 演算子を使用してこれらのオブジェクトを比較するとエラーが発生します。
if($node1 == $node2) //Fatal error: Nesting level too deep - recursive dependency?
これらのオブジェクトを比較する正しい方法は、厳密な比較を使用することであることがわかりました。
if($node1 === $node2) //Works fine
非厳密な比較は、オブジェクトのすべての属性を比較しようとすると思います。そうすることで、無限のネストがあることがわかり、エラーが報告されます。しかし、私が理解できないのは、以下が機能する理由です。
if($node1->next == $node2) //Works fine with == rather than ===
結論:
オブジェクトを比較するには、常に同一性演算子 (===) を使用します。異なるインスタンスを持つ類似のオブジェクトに対して比較で true を返す場合を除きますが、ネストの問題に注意してください。