【发布时间】:2012-01-17 14:27:44
【问题描述】:
我正在构建一个对象数组。我需要这个数组只包含给定对象的一次实例,对同一个对象有多个引用应该抛出异常。我正在使用以下代码来实现这一点:
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以实现更适合您的目的的相等检查方法。
标签: php arrays object recursion circular-reference