ホームページ >バックエンド開発 >PHPチュートリアル >PHP の「foreach」ループは実際にどのように機能するのでしょうか?また、その実装は PHP 5 と PHP 7 でどう変わりましたか?
はじめに:
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例:
PHP 7 の変更点:
ハッシュテーブル イテレーター:
PHP 7 は、配列に登録された外部ハッシュテーブル反復子を使用します。対応する要素が削除されると、各イテレータは前進します。
foreach による IAP の使用なし:
foreach は IAP を使用しなくなり、重複する必要がなくなります。値による配列の反復では、常に元の要素が使用されます。
配列の重複:
配列は、refcount や参照ステータスに関係なく、値による反復中に複製されなくなりました。
PHP 7 の例:
追加の PHP 7 の機能拡張:
以上がPHP の「foreach」ループは実際にどのように機能するのでしょうか?また、その実装は PHP 5 と PHP 7 でどう変わりましたか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。