私はオブジェクトの配列を構築しています。この配列には、指定されたオブジェクトの一度のインスタンスのみを格納する必要があります。同じオブジェクトへの複数の参照が例外をスローする必要があります。私はこれを達成するために、次のコードを使用しています:循環参照を持つオブジェクトのin_array
public function addField ($name, iface\Node $field)
{
// Prevent the same field being added multiple times
if (!in_array ($field, $this -> fields))
{
$this -> fields [$name] = $field;
$field -> setParent ($this);
}
else
{
throw new \InvalidArgumentException ('This field cannot be added to this group');
}
return ($this);
}
は、これは私がNodeインタフェースを実装するオブジェクトを実装し始めたときに問題につながる始め、彼らは循環参照を含めることができるよう(彼らは彼らの子ノードのコレクションを保持します各子供はその親を参照している)。生成され、次のエラーが発生することができますフィールドを追加しようとすると:
PHP Fatal error: Nesting level too deep - recursive dependency?
私はPHPはオブジェクト全体の配列を横断しようとしているだけではなく、彼らは同じ値を保持するかどうかを確認するために、オブジェクト参照を比較している疑いがあるとしたがって、同じオブジェクトを指します。
私がin_arrayに行う必要があるのは、格納しているオブジェクト参照とフィールドのオブジェクト参照を比較するだけです。これにより、オブジェクトツリー全体を横断して再帰問題に陥るのを防ぐことができます。
これを行う方法はありますか?
オブジェクトに「__equals」をオーバーライドして、より適切な等価性チェックの方法を実装してください。 –