在PHP的foreach循环中通过引用迭代器传递的优点是什么?

ale*_*lex 2 php foreach

我刚读过Bill Karwin的这个答案.

请注意,它$node是通过引用传递的.

我一直认为那里创建的变量只是暂时的,只存在于循环结束之前(或者它可能仍然设置为最后一次迭代 - 我还没有测试过).

那么,通过引用传递它有什么好处?

我确定有一个,但我还不知道.

Bil*_*win 6

它与更快或更高效无关.

PHP实现了写时复制,因此在您更改其值之前,变量可能会引用相同的内存区域.然后,当您更改变量时,PHP会决定是否创建副本,具体取决于您是按值还是按引用访问它.

按值访问 - 对变量的更改会创建副本:

$a = array("abc");

foreach ($a as $element) {
  $element = "def";
}

print_r($a);

Array
(
    [0] => abc
)
Run Code Online (Sandbox Code Playgroud)

通过引用访问 - 对变量的更改会影响原始副本:

foreach ($a as &$element) {
  $element = "def";
}

print_r($a);

Array
(
    [0] => def
)
Run Code Online (Sandbox Code Playgroud)

请注意,PHP 5中的所有对象都是通过引用访问的,而不使用&运算符.
这是使用对象的一个​​很好的理由!

在PHP中使用引用要非常小心,因为它们可能会产生令人困惑的效果.

请务必阅读此博客:不要使用 PHP核心开发人员JohannesSchlüter的PHP参考资料

  • *小心!*`$ foo = array(1,2,3); foreach($ foo as&$ bar){$ bar ++; } $ bar = 99; echo $ foo [2];` - 这打印"99".循环结束后,"$ bar"仍然是一个引用.如果你不小心的话,你可以并且会在脚下射击自己. (2认同)