ホームページ >バックエンド開発 >PHPチュートリアル >PHP の「foreach」ループは実際にどのように機能するのでしょうか?また、その実装は PHP 5 と PHP 7 でどう変わりましたか?

PHP の「foreach」ループは実際にどのように機能するのでしょうか?また、その実装は PHP 5 と PHP 7 でどう変わりましたか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-23 22:20:18363ブラウズ

How Does PHP's `foreach` Loop Actually Work, and How Has Its Implementation Changed Between PHP 5 and PHP 7?

foreach は PHP で実際にどのように機能しますか?

はじめに:
foreach はループ処理のために PHP で広く使用されています。配列、オブジェクト、その他のデータ構造を通じて。予期しない動作を回避するには、内部の仕組みを理解することが重要です。

3 種類の foreach 反復可能:
foreach は 3 種類の反復可能:

  • 配列
  • 通常オブジェクト
  • 通過可能なオブジェクト

通過可能なオブジェクトの反復:
通過可能なオブジェクトの場合、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) があります。過剰に削除されたelements.

HashPointer:
PHP 5 の foreach は、HashPointer を使用して、ループ本体を実行する前に IAP の位置とハッシュをバックアップします。要素がまだ存在する場合は、後でそれを復元します。それ以外の場合は、現在の IAP 位置が使用されます。

配列の重複: PHP 5 の
foreach は、参照 (is_ref=0) ではなく、refcount が 1 より大きい配列を複製します。

PHP 5例:

  • テスト ケース 1 と 2 では、配列は refcount=1 で値によって渡されるため、重複しません。
  • テスト ケース 3 では、IAP要素の削除により、ループ後の配列の末尾に設定されます。
  • テスト ケース 4 と 5 では、配列は次のようになります。 by-ref 関数 (それぞれ、リセット) が複製された配列への参照を受け取るため、複製されます。

PHP 7 の変更点:

ハッシュテーブル イテレーター:
PHP 7 は、配列に登録された外部ハッシュテーブル反復子を使用します。対応する要素が削除されると、各イテレータは前進します。

foreach による IAP の使用なし:
foreach は IAP を使用しなくなり、重複する必要がなくなります。値による配列の反復では、常に元の要素が使用されます。

配列の重複:
配列は、refcount や参照ステータスに関係なく、値による反復中に複製されなくなりました。

PHP 7 の例:

  • PHP 7 では、配列が重複していないため、テスト ケース 1 と 2 の出力は PHP 5 と同じになります。
  • PHP 7 では、ループが存在しないため、テスト ケース 3 は異なる出力を生成します。
  • PHP 7 では、テスト ケース 4 と 5 は同様に動作します。これは、それぞれとリセットが引き続きテスト ケースを複製するためです。

追加の PHP 7 の機能拡張:

  • ネストされた反復内の外側のループは、要素が削除されたときに中止されなくなりました。
  • 「時間の矢」問題は次のとおりです。解決しました。

以上がPHP の「foreach」ループは実際にどのように機能するのでしょうか?また、その実装は PHP 5 と PHP 7 でどう変わりましたか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。