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

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中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
11个最佳PHP URL缩短脚本(免费和高级)11个最佳PHP URL缩短脚本(免费和高级)Mar 03, 2025 am 10:49 AM

长URL(通常用关键字和跟踪参数都混乱)可以阻止访问者。 URL缩短脚本提供了解决方案,创建了简洁的链接,非常适合社交媒体和其他平台。 这些脚本对于单个网站很有价值

Instagram API简介Instagram API简介Mar 02, 2025 am 09:32 AM

在Facebook在2012年通过Facebook备受瞩目的收购之后,Instagram采用了两套API供第三方使用。这些是Instagram Graph API和Instagram Basic Display API。作为开发人员建立一个需要信息的应用程序

在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

构建具有Laravel后端的React应用程序:第2部分,React构建具有Laravel后端的React应用程序:第2部分,ReactMar 04, 2025 am 09:33 AM

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

宣布 2025 年 PHP 形势调查宣布 2025 年 PHP 形势调查Mar 03, 2025 pm 04:20 PM

2025年的PHP景观调查调查了当前的PHP发展趋势。 它探讨了框架用法,部署方法和挑战,旨在为开发人员和企业提供见解。 该调查预计现代PHP Versio的增长

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具