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