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 默认为你制作。
Foreach 将数组的每个元素分配给给定变量,就像在简单分配中一样,使用 =
,它将元素的值复制到变量。无论值恰好具有什么类型,这总是正确的。 (只有做了as &$item
才会参考。)
$item
不是 "an object"。 $item
是对象引用,基本上是指向对象的指针。在 PHP 5 中,您不能拥有值为 "is an object" 的变量——当您使用 new something()
时,您将获得对对象的引用;当您使用 ->
访问字段或方法时,左侧必须是对对象的引用。基本上,您总是处理对对象的引用,而不是对象本身。
两个对象引用可以指向同一个对象,如果您通过使用一个对象引用调用方法来修改对象,则结果通过指向同一个对象的另一个对象引用可见。
PHP范式是对象(和资源)总是引用,而其他类型(基类型或数组)被复制,所以&
运算符对对象没有影响(并且对资源没有意义,因为只有 "special functions" 即外部库模块可以将它们作为参数),但允许通过引用传递其他类型的变量。
一段时间以来,我的理解是 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 默认为你制作。
Foreach 将数组的每个元素分配给给定变量,就像在简单分配中一样,使用 =
,它将元素的值复制到变量。无论值恰好具有什么类型,这总是正确的。 (只有做了as &$item
才会参考。)
$item
不是 "an object"。 $item
是对象引用,基本上是指向对象的指针。在 PHP 5 中,您不能拥有值为 "is an object" 的变量——当您使用 new something()
时,您将获得对对象的引用;当您使用 ->
访问字段或方法时,左侧必须是对对象的引用。基本上,您总是处理对对象的引用,而不是对象本身。
两个对象引用可以指向同一个对象,如果您通过使用一个对象引用调用方法来修改对象,则结果通过指向同一个对象的另一个对象引用可见。
PHP范式是对象(和资源)总是引用,而其他类型(基类型或数组)被复制,所以&
运算符对对象没有影响(并且对资源没有意义,因为只有 "special functions" 即外部库模块可以将它们作为参数),但允许通过引用传递其他类型的变量。