php - 为什么 PHP 的 foreach 将其数组的指针(仅)前进一次?

标签 php

这是一个关于在 PHP 中实现 foreach 的方式背后的原因的好奇问题。

考虑:

$arr = array(1,2,3);
foreach ($arr as $x) echo current($arr) . PHP_EOL;

将输出:

2
2
2

我知道 foreach 将数组指针倒回开头;但是,为什么它只增加一次呢?魔盒里面发生了什么??这只是一件(丑陋的)人工制品吗?


感谢@NickC——对于任何对 zvalrefcount 感兴趣的人,您可以阅读基础知识 here

最佳答案

就在第一次迭代之前,$array 被“软复制”以用于 foreach。这意味着没有进行实际的复制,只是将$array的zval的refcount增加到2

第一次迭代:

  1. 值被提取到 $x
  2. 内部数组指针移动到下一个元素,即现在指向2
  3. current 是通过引用传递的 $array 调用的。由于引用 PHP 不能再与循环共享 zval 并且它需要被分离(“硬拷贝”)。

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

对了,我在foreach copying behavior上写了一个小总结.它可能在上下文中很有趣,但它与问题没有直接关系,因为它主要讨论的是硬拷贝。

关于php - 为什么 PHP 的 foreach 将其数组的指针(仅)前进一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8263293/

相关文章:

php - PHPMailer中的"SMTP Error: Could not authenticate"

javascript - 每次点击将类添加到单个 div

php - 如何显示具有多个值的 get-variable 的查询 'DB'?

php - Android 上的 HTTP POST

javascript - 当ajax调用返回响应时使用javascript替换浏览器url而不重定向

php - 如何强制用户注销symfony2

php - 如何根据用户命令字符串为 HTML 元素着色

php - 按类别对结果进行分组,然后将结果分成几天?

php - PHP 中的 DOM/XPATH : What is nodeValue?

php - 无法在 ubuntu 上安装 sqlite