有一段时间我理解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
答案 0 :(得分:2)
在PHP中,对象总是通过引用传递。它是如何工作的?对象具有传递的标识符,我们可以将其称为句柄。所以如果你:
$a = new A();
$b = $a;
$b->foo = 2;
echo $a->foo;
返回值为2
。为什么?因为对象的句柄被复制到$b
,并且它们 - $a
和$b
都指向同一个对象。我们可以将其称为参考,但它不是严格意义上的参考意义,但此实现的行为与参考类似。因此,您不需要使用任何引用,因为PHP默认为您提供。
答案 1 :(得分:2)
PHP范例是对象(和资源)总是引用,而其他类型(基类型或数组)被复制,因此&
运算符对对象没有影响(和在资源上没有意义,因为只有“特殊功能”,即外部库模块可以将它们作为参数),但允许通过引用传递其他类型的变量。
答案 2 :(得分:1)
Foreach将数组的每个元素分配给给定变量,就像在简单赋值中一样,使用=
将元素的值复制到变量中。无论该值恰好具有何种类型,都始终如此。 (只有当你as &$item
时,它才会成为参考。)
$item
不是"对象"。 $item
是一个对象引用,基本上是指向对象的指针。在PHP 5中,你不能拥有一个变量,其值为#34;是一个对象" - 当你new something()
时,你得到一个对象的引用;当您使用->
访问字段或方法时,左侧必须是对象的引用。基本上,你总是处理对象的引用,而不是对象本身。
两个对象引用可以指向同一个对象,如果通过使用一个对象引用调用其上的方法来修改对象,则通过指向同一对象的另一个对象引用可以看到结果。