PHP foreach by reference 在通过对象数组时会导致奇怪的故障

2022-08-30 20:36:16

我有一个对象数组。这些对象主要具有一堆属性,因为这些属性是元数据对象。

所以它就像是一堆具有属性的项目,如:,,等。$objects[]object->item1object->item2

我想向这些对象中的每一个添加一些东西,所以...

foreach ($objects as &$object) {
  $object->newItem=(something I compute);
}

然后,我想将这些对象显示为html中的列表。所以,我去:

foreach ($objects as $object) {
  <li><?php object output stuff here ?></li>
}

还行。现在,它工作正常,除了最后一个对象被丢弃,倒数第二个对象显示两次。跆拳道??

这对你有意义吗?


答案 1

如果按引用进行迭代,请始终在之后取消设置迭代变量:

foreach ($objects as &$object) {
      // some code
}
unset($object);

摘自前期文档

$value的引用和最后一个数组元素即使在 foreach 循环之后仍保留。建议通过 unset() 销毁它。

如果你想了解为什么你的代码会以这种方式表现,这里有一些进一步的阅读:引用和foreach


答案 2

对象始终是引用,因此只需删除“&”即可

foreach ($objects as $object) {
  $object->newItem=(something I compute);
}

foreach ($objects as $object) {
  echo "<li>{$object->someResult()}</li>";
}

我知道你已经得到了答案,但这可能有助于其他开发人员更快地找到答案。


推荐