PHP 5 与 PHP 7 关于 foreach 疑问?
PHP手册5.X升级7.0写到:
foreach 通过值遍历时,操作的值为数组的副本
当默认使用通过值遍历数组时,foreach 实际操作的是数组的迭代副本,而非数组本身。这就意味着,foreach 中的操作不会修改原数组的值。
我以为PHP 5 中 foreach 直接操作数组, 而不是复制数组, foreach操作数组副本, 为了验证这个, 我测试一下代码:
$arr = [1, 2, 3];
foreach ($arr as $v) {
unset($arr[2]);
var_dump($v);
}
var_dump($arr);
结果跟我想的不一样, 打印出来的结果, 为
PHP 7 与 PHP 5结果一样, 我不明白的是如果结果是一样的, 为何升级手册上会写这个? 谷歌查询一下, 在一篇文章中解释手册这个手册这段话, 写几行代码:
$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}
var_dump($array);
其结果又跟我想的不一样, 以为都打印出 0, 2.
越想越糊涂, PHP5 操作的是数组本身还是数组复制, 在sf.gg上有一篇文章"当我们使用foreach时,内部究竟发生了什么(PHP5)" 写到:
其实foreach遍历过程中,并不是直接操作$arr(原数组)的,而是会将$arr复制出一个$arrcopy(是一个$arr的一个复制品,我这里以$arrcopy代替),foreach在遍历过程中操作的其实一直是$arrcopy。
越看越觉得奇怪, 又在stackoverflow 看到有关于我类似的问题, 英文能力不行, 勉强靠翻译看了一些, 提及到底层相关知识, 太深奥了. 还是不懂, PHP 5 如果是操作数组副本的话, 应该会跟PHP 7 结果一样, 但是数组前面加了引用, 其结果也不同了. 而且手册上不会写这个段话的
推荐文章: