首頁 > 後端開發 > php教程 > PHP 的「foreach」迴圈實際上是如何運作的,其實作在 PHP 5 和 PHP 7 之間有何變化?

PHP 的「foreach」迴圈實際上是如何運作的,其實作在 PHP 5 和 PHP 7 之間有何變化?

Mary-Kate Olsen
發布: 2024-12-23 22:20:18
原創
394 人瀏覽過

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 ($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();
    // ...
}
登入後複製
可遍歷對象

對於可遍歷對象,foreach

陣列與物件迭代:

有序字典: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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板