在PHP 7向后兼容的改变文件说,有关的foreach如下:
在默认的按值模式下使用时,
foreach现在将对正在迭代的数组的副本进行操作,而不是对数组本身进行操作.这意味着在迭代期间对数组所做的更改不会影响迭代的值.
我试图理解这意味着什么,我的主要问题是这个代码在PHP 7中是否与PHP 5.6中的相同?
foreach($array as $elementKey => $element) {
if ($element == 'x') {
unset($array[$elementKey]);
}
}
Run Code Online (Sandbox Code Playgroud)
我的两个问题是:
这段代码还能用吗?
如果是这样,你能解释一下(可能通过例子)PHP 7中的这一新变化意味着什么吗?
编辑
我一直在重读这份文件声明.我认为这意味着,如果您更改数组中较低项的值,那么当您在迭代中找到这些项时,这些更改将不会存在.例:
$array = ['x', 'y', 'z'];
$new = [];
foreach($array as $element) {
if ($element == 'x') {
$array[2] = 'a';
}
$new[] = $element;
}
print_r($new);
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这个例子时,它似乎没有显示PHP版本的任何差异(虽然我以前从未使用过这个工具,所以我不确定它是如何工作的).
我意识到,如果我通过参考来做,我会得到一个a新的.否则我不会.但这两个版本似乎都是这种情况.
我真正需要知道的是什么是不兼容性(例如)?
编辑2
@NikiC 建议的答案链接提供了我正在寻找的故事的其余部分:
在大多数情况下,这种变化是透明的,除了更好的性能外没有其他影响.但是有一种情况会导致不同的行为,即数组事先是参考的情况:
$array = [1, 2, 3, 4, 5]; …Run Code Online (Sandbox Code Playgroud)