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