PHP の 'foreach' は実際にどのように機能しますか?
PHP の foreach は配列、オブジェクト、および Traversable を反復処理します。オブジェクト。
配列:
- Foreach は配列のキーと値を反復処理します。
- 反復中に変更を行うと、予期しない動作が発生する可能性があります。
- PHP 5 では、foreach は内部配列ポインター (IAP) を使用します。複数のループ間で共有できるため、複雑な動作が発生する可能性があります。
- PHP 7 では、foreach は外部の安全なハッシュテーブル イテレータを使用するため、IAP の必要がなくなります。
オブジェクト:
- Foreach はオブジェクトのプロパティを反復処理し、値。
- 反復中の変更はループに反映されます。
- これは、オブジェクトが参照のように動作する PHP のハンドル渡しセマンティクスによるものです。
横断可能オブジェクト:
- Foreach は基本的に、Traversable オブジェクトを走査するための構文上のショートカットを提供します。
例:
- 複製: PHP 5 は、次の場合に反復する前に配列を複製します。配列は参照ではなく、参照カウントが 1 より大きいです。PHP 7 は可能な限りこの重複を回避します。
- 位置の進み順序: Foreach はループ本体が実行される前に配列ポインターを進めるため、要素 i で動作します。ループ本体がまだ要素 i にある間は 1。
- 反復中の変更: Foreach は、次の要素に依存しているため、PHP 5 で削除された要素をスキップします。 IAP。 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 中国語 Web サイトの他の関連記事を参照してください。