我正在尝试理解此代码:
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
在PHP 5.6中,结果将为int(1) int(2) bool(false)
,在PHP 7中,结果将为int(0) int(0) int(0)
。问题是为什么?
为什么在两种情况下结果都不为数组0, 1, 2
的值?我知道PHP中的current()
返回当前值,因此每次foreach遍历每个值时,不是应该打印出当前值吗?
答案 0 :(得分:4)
foreach
的实现在PHP 7.0中已更改为described in this migration note:
在PHP 7之前,内部数组指针在使用foreach迭代数组时进行了修改。情况不再如此。
current()
函数返回“内部数组指针”所指向的元素,“内部数组指针”来自旧版本的PHP,在现代代码中很少使用。可以将其用作the each()
function的替代循环机制,该机制已在PHP 7.2中弃用。
在旧版本的PHP中,each()
和foreach
都更改了此“内部数组指针”,因此您可以混合使用foreach
和current
,如示例所示。但是,这意味着内部代码在某些情况下会不必要地变得复杂且缓慢,因此在PHP 7.0中对其进行了更改。现在,foreach
以不同的方式跟踪其在数组中的位置,current()
无法读取。