PHP 7不兼容变更文档 中对于foreach的说明如下:
我试图理解这是什么意思,我的主要问题是这段代码在PHP 7和PHP 5.6中是否工作相同?在默认情况下,使用按值传递模式的
foreach
将在被迭代的数组副本上运行,而不是在数组本身上运行。这意味着在迭代过程中对数组所做的更改将不会影响到被迭代的值。
foreach($array as $elementKey => $element) {
if ($element == 'x') {
unset($array[$elementKey]);
}
}
我的两个问题是:
这段代码还能用吗?
如果可以,你能否解释一下(例如通过实例)PHP 7 中这个新变化的含义是什么?
编辑
我一直在重新阅读文档说明。我认为它的意思是,如果你更改数组中较低位置的值,在迭代到这些项时,这些更改不会存在。例如:
$array = ['x', 'y', 'z'];
$new = [];
foreach($array as $element) {
if ($element == 'x') {
$array[2] = 'a';
}
$new[] = $element;
}
print_r($new);
然而,当我运行此示例时,PHP版本似乎没有任何区别(虽然我之前从未使用过此工具,所以不确定它的工作原理)。
我意识到如果我通过引用进行操作,那么新变量中将会有一个a
。否则就不会有。但这在两个版本中都是如此。
我真正需要知道的是哪里存在不兼容性(例如)?
编辑2
@NikiC提供的答案链接给出了我寻找的剩余部分:
在大多数情况下,这种更改是透明的,除了更好的性能外,不会产生任何其他效果。但是,在数组事先是引用的情况下,有一种情况会导致不同的行为:
$array = [1, 2, 3, 4, 5];
$ref = &$array;
foreach ($array as $val) {
var_dump($val);
$array[2] = 0;
}
/* Old output: 1, 2, 0, 4, 5 */
/* New output: 1, 2, 3, 4, 5 */
在PHP 7中,引用数组的按值迭代不再是特例。在此情况下,没有发生复制,因此在迭代期间对数组的所有修改都将由循环反映出来。现在,每次按值迭代数组时,都会继续处理原始元素,无论循环期间进行了任何修改。本答案解释了罕见的“特殊情况”,即在版本之间的foreach
操作在处理数组副本时工作方式不同的情况。