PHP 在 Foreach 中按引用传递
在 PHP 中,变量可以是普通变量,也可以是引用变量。当将一个变量的引用分配给另一个变量时,后者成为引用变量,本质上绑定到与原始变量相同的内存位置。当使用带有引用传递语法 (&) 的 foreach 循环时,此行为会产生影响。
考虑以下代码:
$a = ['zero', 'one', 'two', 'three']; foreach ($a as &$v) { } foreach ($a as $v) { echo $v . PHP_EOL; }
此代码的输出为:
zero one two two
为什么会发生这种情况?
在第一个 foreach 循环中,$a 的每个元素都被分配为对变量 $v 的引用。这意味着对 $v 的任何修改也会修改 $a 中的相应元素。
具体来说,在第一个循环的最后一次迭代期间,$v 被分配 $a[3] 的值(即,'三')。但是,此赋值创建了引用关系,因此 $a[3] 成为引用变量(即使没有使用 & 显式赋值)。
在第二个 foreach 循环中,$a[3] 中元素的值a 被打印。然而,由于 $a[3] 现在是一个引用变量,它的值随着 $v 的值而变化。当 $v 在第三次迭代中被赋值为“two”时,$a[3] 也变为“two”。
因此,在最后一次迭代中,$v(仍然指向 $a) [3]) 的值为“two”,并且打印“two”。这解释了为什么在最后一次迭代中重复“二”,而不是像人们直观期望的那样打印“三”。
以上是为什么带有引用传递 (&) 的 PHP foreach 会意外更改数组元素?的详细内容。更多信息请关注PHP中文网其他相关文章!