搞WordPress,难免跟php打交道
然而这弱类型语言实在坑有点多
这不今儿又踩了个大坑直接时间-1
话不多说直接上代码
$items = [1,2];
foreach ($items as &$item) {/*empty loop*/}
print_r($items);
foreach ($items as $item) {/*empty loop*/}
print_r($items);
请问,最后的输出是什么?
答案是:
Array
(
[0] => 1
[1] => 2
)
Array
(
[0] => 1
[1] => 1
)
不是,我啥也没干呢,发生什么事了?
我懂了,一定是我的/*empty loop*/
注释把数据改了!(不是)
原因其实有二,但凡php没那么“强大”都不会造成这个问题
同时满足这俩条件的语言好像还真蛮少的
因此我这不就暴毙了嘛
$item
赋值$item
事实上是最后一个元素的引用$item
并没有因为循环结束而终止生命周期因此,最后一个元素在第二次循环中被赋值了n次
如果$items=[1,2,3]
,最后的结果是什么?
答案是:Array([0] => 1 [1] => 2 [2] => 2)
这个错误造成的不是第二次输出全部重复,而只是第n
个元素被修改成n-1
的值
跟着循环走一遍就很好理解:
$item = $items[0] === 1
,此时$items[2] === $item === 1
$item = $items[1] === 2
,此时$items[2] === $item === 2
$item = $items[2] === 2
(因为上一步)谢谢你,我的PHP
PHP Foreach Pass by Reference: Last Element Duplicating? (Bug?)