为什么PHP的foreach一次推进其数组的指针(仅)?

jlb*_*jlb 19 php

这是一个好奇的问题,关于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 -为别人好奇zvalrefcount,您可以在基础读到这里

Nik*_*kiC 15

在第一次迭代之前,$array"软复制"用于foreach.这意味着没有实际的副本,但只有refcountzval的$array增加到2.

在第一次迭代:

  1. 该值被提取到$x.
  2. 内部数组指针移动到下一个元素,即现在指向2.
  3. current$array通过引用传递调用.由于参考PHP不能再zval与循环共享它需要分开("硬复制").

在接下来的迭代中,$arrayzval因此不再与foreachzval 相关.因此,它的数组指针不再被修改,并且current总是返回相同的元素.

顺便说一句,我已经写了一个关于foreach复制行为的小摘要.它可能对上下文感兴趣,但它并不直接与问题直接相关,因为它主要涉及硬拷贝.