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: слишком глубокий уровень вложенности - рекурсивная зависимость?

Я подозреваю, что PHP пытается пройти через весь массив объектов, а не просто сравнивает ссылки на объекты, чтобы узнать, содержат ли они одно и то же значение и, следовательно, указывают на один и тот же объект.

Мне нужно, чтобы in_array просто сравнивал ссылки на объекты, которые он хранит, со ссылкой на объект поля. Это предотвратило бы попытку обхода всего дерева объектов и столкновение с проблемой рекурсии.

Есть ли способ сделать это?

12
задан GordonM 10 December 2011 в 21:27
поделиться