Я создаю массив объектов. Мне нужно, чтобы этот массив содержал только один экземпляр данного объекта, имеющий несколько ссылок на один и тот же объект, должен вызывать исключение. Для этого я использую следующий код:
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 Неустранимая ошибка: уровень вложенности слишком глубокий - рекурсивная зависимость?
Я подозреваю, что PHP пытается пересечь весь массив объектов, а не просто сравнивать ссылки на объекты, чтобы увидеть, сохраняют ли они одно и то же значение и поэтому указывают на один и тот же объект.
Мне нужно in_array, чтобы просто сравнить ссылки на объекты, которые он хранит, с ссылкой на объект. Это предотвратило бы попытку пересечения всего дерева объектов и столкновения с проблемой рекурсии.
Есть ли способ сделать это?