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 中,对象总是通过引用传递。它是如何工作的?对象有传递的标识符,我们可以调用这个handle。所以如果你:

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

return 值将为 2。为什么?因为对象的 handle 被复制到 $b 并且它们 - $a$b - 指向同一个对象。我们可以将其称为引用,但严格来说它不是引用的意思,但此实现的行为类似于引用。所以你不需要任何引用,因为 PHP 默认为你制作。

阅读OOP references documentation

Foreach 将数组的每个元素分配给给定变量,就像在简单分配中一样,使用 =,它将元素的值复制到变量。无论值恰好具有什么类型,这总是正确的。 (只有做了as &$item才会参考。)

$item 不是 "an object"。 $item 是对象引用,基本上是指向对象的指针。在 PHP 5 中,您不能拥有值为 "is an object" 的变量——当您使用 new something() 时,您将获得对对象的引用;当您使用 -> 访问字段或方法时,左侧必须是对对象的引用。基本上,您总是处理对对象的引用,而不是对象本身。

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

PHP范式是对象(和资源)总是引用,而其他类型(基类型或数组)被复制,所以& 运算符对对象没有影响(并且对资源没有意义,因为只有 "special functions" 即外部库模块可以将它们作为参数),但允许通过引用传递其他类型的变量。