这是一个好奇的问题,关于foreach在PHP中实现该方法背后的原因.
考虑:
$arr = array(1,2,3);
foreach ($arr as $x) echo current($arr) . PHP_EOL;
Run Code Online (Sandbox Code Playgroud)
这将输出:
2
2
2
Run Code Online (Sandbox Code Playgroud)
我明白将foreach数组指针倒回到开头; 但是,为什么它只增加一次呢?魔术盒里面发生了什么?这只是一个(丑陋的)人工制品吗?
感谢@NickC -为别人好奇zval和refcount,您可以在基础读到这里
Nik*_*kiC 15
在第一次迭代之前,$array"软复制"用于foreach.这意味着没有实际的副本,但只有refcountzval的$array增加到2.
在第一次迭代:
$x.2.current$array通过引用传递调用.由于参考PHP不能再zval与循环共享它需要分开("硬复制").在接下来的迭代中,$arrayzval因此不再与foreachzval 相关.因此,它的数组指针不再被修改,并且current总是返回相同的元素.
顺便说一句,我已经写了一个关于foreach复制行为的小摘要.它可能对上下文感兴趣,但它并不直接与问题直接相关,因为它主要涉及硬拷贝.
| 归档时间: |
|
| 查看次数: |
1622 次 |
| 最近记录: |