gpt4 book ai didi

php - 具有循环引用的对象上的 in_array

转载 作者:行者123 更新时间:2023-12-02 08:25:31 32 4
gpt4 key购买 nike

我正在构建一个对象数组。我需要这个数组仅包含给定对象的一个​​实例,对同一对象的多个引用应该引发异常。我使用以下代码来实现此目的:

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 接口(interface)的对象时,这开始导致问题,因为它们可以包含循环引用(它们保存子节点的集合,每个子节点保存对其父节点的引用)。尝试添加字段可能会导致生成以下错误:

PHP Fatal error: Nesting level too deep - recursive dependency?

我怀疑 PHP 正在尝试遍历整个对象数组,而不是仅仅比较对象引用以查看它们是否具有相同的值,从而指向同一个对象。

我需要 in_array 做的只是将它存储的对象引用与字段的对象引用进行比较。这将防止它尝试遍历整个对象树并遇到递归问题。

有办法做到这一点吗?

最佳答案

事实证明答案非常简单。默认情况下,in_array 在测试大海捞针时似乎会进行非严格比较(相当于 == 操作)。这意味着它会检查所有属性是否相等,这意味着它开始遍历对象图,如果该图中存在循环引用,这可能会给您带来麻烦。

然而,in_array 函数有一个严格模式,据我所知,它相当于 === 操作。这似乎导致它检查引用以查看它们是否指向同一个对象,而不是比较所有属性。

只需将代码更改为:

if (!in_array ($field, $this -> fields, true))

使该方法按照我希望的方式运行,而不会触发递归错误。

我不得不说,我有点惊讶 PHP 默认情况下不采用这种模式。另一方面,我想我真的不应该对 PHP 的弱类型再次给我带来问题感到惊讶。 :)

关于php - 具有循环引用的对象上的 in_array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460011/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com