首页 > 后端开发 > php教程 > PHP 的'foreach”循环实际上是如何工作的,其实现在 PHP 5 和 PHP 7 之间有何变化?

PHP 的'foreach”循环实际上是如何工作的,其实现在 PHP 5 和 PHP 7 之间有何变化?

Mary-Kate Olsen
发布: 2024-12-23 22:20:18
原创
353 人浏览过

How Does PHP's `foreach` Loop Actually Work, and How Has Its Implementation Changed Between PHP 5 and PHP 7?

foreach 在 PHP 中实际是如何工作的?

简介:
foreach 在 PHP 中广泛用于循环通过数组、对象和其他数据结构。了解其内部工作原理对于避免意外行为至关重要。

三种类型的 foreach 可迭代对象:
foreach 支持三种类型的可迭代对象:

  • 数组
  • 正常对象
  • 可遍历对象

可遍历对象迭代:
对于可遍历对象,foreach充当以下语法糖:

foreach ($it as $k => $v) {}

translates to:

if ($it instanceof IteratorAggregate) {
    $it = $it->getIterator();
}
for ($it->rewind(); $it->valid(); $it->next()) {
    $v = $it->current();
    $k = $it->key();
    // ...
}
登录后复制

数组和对象迭代:

有序字典:
PHP 数组和对象本质上是维护插入顺序的有序字典。迭代遵循此顺序。

对象转换:
打包对象表示在迭代期间转换为字典。因此,普通对象迭代变得类似于数组迭代。

内部数组指针(IAP):
PHP 5 中的数组有一个内部数组指针(IAP),支持修改和跳过覆盖已删除的元素。

HashPointer:
PHP 中的 foreach 5 在运行循环体之前使用 HashPointer 来备份 IAP 位置和哈希值。如果该元素仍然存在,它会在之后恢复它;否则,它使用当前 IAP 位置。

数组重复:
PHP 5 中的 foreach 会复制非引用 (is_ref=0) 且引用计数大于 1 的数组。

PHP 5示例:

  • 在测试用例 1 和 2 中,数组不会重复,因为它们的 refcount=1 并且按值传递。
  • 在测试用例 3 中,IAP由于元素移除,循环后被设置为数组的末尾。
  • 在测试用例 4 和 5 中,数组是重复的因为 by-ref 函数(each、reset)接收到对重复数组的引用。

PHP 7 更改:

哈希表迭代器:
PHP 7 使用外部哈希表迭代器,在数组中注册。如果删除相应的元素,每个迭代器都会前进。

foreach 不使用 IAP:
foreach 不再使用 IAP,从而消除了重复的需要。按值数组迭代始终使用原始元素。

数组重复:
数组在按值迭代期间不再重复,无论其引用计数或引用状态如何。

PHP 7 示例:

  • 在 PHP 7 中,测试用例 1 和 2 与 PHP 5 具有相同的输出,因为数组不重复。
  • 在 PHP 7 中,测试用例 3 产生不同的输出,因为循环没有不再影响 IAP。
  • 在 PHP 7 中,测试用例 4 和 5 的行为类似,因为each和reset仍然复制数组,而foreach使用原始数组数组。

其他 PHP 7 增强功能:

  • 当内循环中的元素被删除时,嵌套迭代中的外循环不再中止。
  • “时间之箭”问题已解决。

以上是PHP 的'foreach”循环实际上是如何工作的,其实现在 PHP 5 和 PHP 7 之间有何变化?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板