Estoy construyendo una matriz de objetos. Necesito que este conjunto contenga solo una instancia de un objeto dado, que tenga múltiples referencias al mismo objeto y arroje una excepción. Estoy utilizando el código siguiente para lograrlo:in_array en objetos con referencias circulares
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);
}
Esto comenzó dando lugar a problemas cuando empecé a implementar los objetos que implementan la interfaz Node, ya que pueden incluir referencias circulares (que poseen una colección de sus nodos secundarios , con cada niño sosteniendo una referencia a su padre). Se trata de añadir un campo puede dar como resultado el siguiente error se genera:
PHP Fatal error: Nesting level too deep - recursive dependency?
sospecho que PHP está tratando de atravesar toda la gama de objetos, en lugar de comparar únicamente las referencias a objetos para ver si tienen el mismo valor y por lo tanto, apunta al mismo objeto.
Lo que necesito hacer en_array es simplemente comparar las referencias de objeto que almacena con la referencia de objeto del campo. Esto evitaría que intente atravesar todo el árbol de objetos y se encuentre con el problema de recursión.
¿Hay alguna forma de hacerlo?
Intenta anular '__equals' en su objeto para implementar un método de comprobación de igualdad más adecuado para sus propósitos. –