foreach 循环中的对象通过引用传递,不带 “&”


Objects in foreach Loop are Passed by Reference Without "&"

一段时间

以来,我的理解是foreach在其迭代中克隆单个对象,并且我使用&通过引用进行迭代。但是,在运行 PHP 5.5.10 的最新机器中,我可以省略&并且仍然更新原始对象。我在发行说明中看不到任何内容。我是不是误会了什么?

foreach ($items as $item) {    // No "&"
    $item->setData('123');    // Updates the respective object in $items
    // Checked object ID hash, and they're the same with or without "&"
}

PHP 更新日志: http://php.net/ChangeLog-5.php

PHP 范式是对象(和资源(始终是引用,

其他类型(基类型或数组(是复制的,因此 & 运算符对对象没有影响(并且对资源毫无意义,因为只有"特殊函数",即外部库模块可以将它们作为参数(,但允许通过引用传递其他类型的变量。

在PHP中,对象总是通过引用传递。它是如何工作的?对象具有传递的标识符,我们可以调用此句柄。因此,如果您:

$a = new A();
$b = $a;
$b->foo = 2;
echo $a->foo;

返回值将为 2 。为什么?因为对象的句柄被复制到$b并且它们($a$b(都指向同一个对象。我们可以将其称为引用,但它不是严格意义上的引用含义,但此实现的行为类似于引用。所以你不需要使用任何引用,因为PHP默认为你做它。

阅读OOP references documentation

Foreach 将数组的每个元素分配给给定变量,就像在简单赋值中一样,使用 = ,这会将元素的值复制到变量。无论值碰巧具有哪种类型,这始终是正确的。(只有当你这样做as &$item它才会成为参考。

$item不是"对象"。 $item是一个对象引用,基本上是一个指向对象的指针。在 PHP 5 中,你不能有一个值"是一个对象"的变量——当你做new something()时,你会得到一个对象的引用;当您使用 -> 访问字段或方法时,左侧必须是对对象的引用。基本上,您始终处理对对象的引用,而不是对象本身。

两个对象引用可以指向同一对象,

如果通过使用一个对象引用调用对象上的方法来修改对象,则结果通过指向同一对象的另一个对象引用可见。