简介:
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示例:
PHP 7 更改:
哈希表迭代器:
PHP 7 使用外部哈希表迭代器,在数组中注册。如果删除相应的元素,每个迭代器都会前进。
foreach 不使用 IAP:
foreach 不再使用 IAP,从而消除了重复的需要。按值数组迭代始终使用原始元素。
数组重复:
数组在按值迭代期间不再重复,无论其引用计数或引用状态如何。
PHP 7 示例:
其他 PHP 7 增强功能:
以上是PHP 的'foreach”循环实际上是如何工作的,其实现在 PHP 5 和 PHP 7 之间有何变化?的详细内容。更多信息请关注PHP中文网其他相关文章!