一段时间
以来,我的理解是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()
时,你会得到一个对象的引用;当您使用 ->
访问字段或方法时,左侧必须是对对象的引用。基本上,您始终处理对对象的引用,而不是对象本身。
如果通过使用一个对象引用调用对象上的方法来修改对象,则结果通过指向同一对象的另一个对象引用可见。