foreach变更
1. foreach()迭代不再影响数组内部指针(可被current()/next()等一族函数访问). 例如,
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
----------
PHP7 打印三次int(0)
PHP5 依次输出int(1), int(2), bool(false)
2. 通过by-value方式迭代数组时, foreach 是对该数组的拷贝操作,数组迭代期间数据修改不会影响迭代行为.
$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}
----------
PHP7 打印所有元素(0 1 2)
PHP5 第二个元素1会被跳过.
3. 通过by-reference方式迭代数组时候, 对数组元素的修改会影响迭代.
多数情况下, PHP会正确维护迭代位置.比如, 以by-reference方式在迭代期间向数组追加元素:
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
----------
PHP7 遍历追加元素, 输出int(0) int(1)
PHP5 只会输出int(0)
4. 以 by-value 或 by-reference 方式迭代普通对象(非Traversable)都与以 by-reference 方式迭代数组行为一致. 不过对位置的管理会更加精确.
5. Traversable对象迭代行为不变.
Relevant RFC: