PHP 的 foreach 實際上是如何運作的?
PHP 的 foreach 迭代數組、物件和 Traversable物件。
陣列:
- Foreach 迭代數組的鍵和值。
- 迭代期間的修改可能會導致意外行為。
- 在 PHP 5 中,foreach 使用內部陣列指標(IAP),可以在多個陣列之間共用循環,導致複雜的行為。
- 在 PHP 7 中,foreach 使用外部、安全的雜湊表迭代器,消除了對 IAP 的需求。
物件:
- Foreach 迭代物件的屬性並值。
- 迭代過程中的修改會反映在循環中。
- 這是由於 PHP 的 by-handle 傳遞語義,使得物件的行為類似於引用。
可遍歷物件:
- Foreach 本質上提供了遍歷 Traversable 物件的語法捷徑。
範例:
- 複製:如果陣列不是引用,則 PHP 5 在迭代之前複製數組,並且引用計數大於 1。 PHP 7 避免了這種重複
- 位置前進順序:Foreach 在循環體運行之前前進數組指針,因此它在循環體仍在元素 i 上時對元素 i 1 起作用。
- 迭代期間的修改:由於依賴 IAP,Foreach 會跳過 PHP 5 中刪除的元素。在 PHP 7 中,即使刪除元素後,foreach 也會繼續迭代。
- Reset() 和 Each():在 PHP 5 中,HashPointer 備份和復原機制可防止 reset() 影響 foreach。在 PHP 7 中,reset() 獨立於 foreach 運作。
- 取代實體:PHP 允許在循環期間取代迭代實體(例如,從陣列開始並切換到物件)。
總結:
PHP 的 foreach 迭代數組和物件有效,提供對其元素的方便存取。了解其實作細節(尤其是 PHP 5 和 PHP 7 之間的差異)可以幫助您避免在迭代期間修改陣列時出現意外行為。
以上是PHP 的「foreach」迴圈在內部如何運作,以及它的實作在 PHP 5 和 PHP 7 之間有何變化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!