foreach循环中的对象通过引用传递而没有“&”

时间:2015-02-20 18:51:13

标签: php loops object foreach pass-by-reference

有一段时间我理解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

3 个答案:

答案 0 :(得分:2)

在PHP中,对象总是通过引用传递。它是如何工作的?对象具有传递的标识符,我们可以将其称为句柄。所以如果你:

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

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

阅读OOP references documentation

答案 1 :(得分:2)

PHP范例是对象(和资源)总是引用,而其他类型(基类型或数组)被复制,因此&运算符对对象没有影响(和在资源上没有意义,因为只有“特殊功能”,即外部库模块可以将它们作为参数),但允许通过引用传递其他类型的变量。

答案 2 :(得分:1)

Foreach将数组的每个元素分配给给定变量,就像在简单赋值中一样,使用=将元素的值复制到变量中。无论该值恰好具有何种类型,都始终如此。 (只有当你as &$item时,它才会成为参考。)

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

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