理解 PHP 的 'foreach' 循环
'foreach' 支持迭代三种类型的值:
数组和对象迭代
数组和对象作为有序字典进行遍历。遍历普通对象与遍历数组类似,因为它们在内部表示为有序字典。
迭代期间的内部变化
- 按引用数组迭代或迭代对象(按句柄语义)允许在迭代时进行循环内修改。
- 迭代引用计数大于 1 的数组可能会在修改之前重复数组。
PHP 5 方法
- 使用内部数组指针 (IAP)跟踪位置。
- 另外采用 HashPointer 来支持多个同时“foreach”循环。
- 如果引用计数大于 1 并且数组不是引用,则会发生数组重复。
- IAP 推进发生在 循环体运行之前。
PHP 7方法
- 完全放弃 IAP 使用。
- 引入在数组中注册的哈希表迭代器来处理迭代中的修改。
- 按值进行数组重复仅当在循环期间修改数组时才会发生数组迭代。
- 'foreach' 行为不存在不再受‘current()’或‘reset()’影响。
您问题的解答
1.这是正确的吗?
您将“foreach”理解为使用数组副本但影响数组指针是正确的。然而,在 PHP 7 中,“foreach”不再使用 IAP,而是依赖于哈希表迭代器,从而产生更加一致和可预测的行为。
2.它到底在做什么?
- PHP 5:使用 IAP 和 HashPointer 的组合来支持迭代,在某些情况下可能会出现重复和意外行为。
- PHP 7:使用不受“foreach”循环影响的哈希表迭代器,并正确处理迭代过程中的修改迭代。
3.在某些情况下,在“foreach”期间使用调整数组指针的函数会影响循环的结果吗?
-
PHP 5:“each()”和“reset()”可以影响嵌套“foreach”循环的行为,甚至可能因哈希冲突而遇到意外行为。
-
PHP 7: 调整数组指针的函数对“foreach”行为没有影响,因为它不再依赖于IAP。
以上是PHP 的'foreach”循环在 PHP 5 和 PHP 7 中如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!