PHP 'foreach' 实际上是如何工作的?
在 PHP 中,foreach 语句是一种语言构造,用于迭代数组或可遍历对象。 foreach 循环被设计为以可预测且高效的方式工作,并且在 PHP 5 和 PHP 7 之间经历了重大更改,以改进其功能和性能。
PHP 5
在 PHP 5 中,foreach 语句使用内部数组指针 (IAP) 来跟踪和管理迭代。 IAP 是一种集中式机制,允许多个 foreach 循环和其他与数组交互的函数来协调它们的操作。
但是,由于使用共享 IAP,PHP 5 中的 foreach 表现出了一些限制:
-
数组重复:如果引用的数组按值迭代,则该数组将被复制以防止在迭代过程中被修改迭代不会影响原始数组(例如,当使用像 Reset()、each() 等函数时)。这种不必要的重复影响了性能。
-
对 IAP 的干扰:通过 Reset() 等函数对 IAP 进行的更改并不总是会影响 foreach 循环。这可能会导致在某些情况下出现意外行为。
PHP 7
PHP 7 对 foreach 实现进行了重大改进。最显着的变化是引入了外部哈希表迭代器,它取代了单个IAP。
-
外部哈希表:每个foreach循环维护自己的外部哈希表迭代器。该迭代器跟踪正在迭代的数组或对象中的当前位置和其他相关信息。得益于这些独立的迭代器,foreach 循环不再修改底层数组的 IAP,从而消除了干扰问题。
-
无数组重复:在 PHP 7 中,数组的按值迭代不会涉及重复。如果在循环期间修改数组,它将按需克隆(遵循写时复制机制)。与 PHP 5 不必要的重复相比,这显着提高了性能。
对行为的影响
与 PHP 7 相比,PHP 7 foreach 实现的变化导致了一些行为差异PHP 5:
-
数组修改:在 PHP 5 中,在按值 foreach 循环期间对引用数组的修改将反映在循环中。然而,在 PHP 7 中,数组的按值迭代始终对原始元素进行操作,而不管循环期间进行的修改如何。
-
IAP 修改:使用重置等函数对 IAP 进行更改() 不再直接影响 PHP 7 中的 foreach 循环。 foreach 维护自己的迭代器,不受外部更改的影响IAP。
使用指南
为了确保最佳使用并避免 foreach 语句的潜在问题,请考虑以下指南:
- 尽可能首选按值迭代。这可以避免创建额外的迭代器并提高性能。
- 请注意 PHP 5 和 PHP 7 之间关于按值迭代期间数组修改的行为变化。
- 修改时要小心在 foreach 循环期间迭代的数组或对象,因为根据具体情况,它可能会导致意外的行为。
以上是PHP 的'foreach”循环在 PHP 5 和 PHP 7 中的工作方式有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!