PHP の「foreach」は実際にどのように機能しますか?
PHP では、foreach ステートメントは、オブジェクトの要素を反復処理するために使用される言語構造です。配列またはトラバース可能なオブジェクト。 foreach ループは、予測可能かつ効率的な方法で動作するように設計されており、機能とパフォーマンスを向上させるために、PHP 5 と PHP 7 の間で大幅な変更が加えられています。
PHP 5
PHP 5 では、foreach ステートメントは内部配列ポインター (IAP) を使用して反復を追跡および管理します。 IAP は、配列と対話する複数の foreach ループやその他の関数が操作を調整できるようにする集中メカニズムです。
ただし、共有 IAP の使用により、PHP 5 の foreach にはいくつかの制限がありました。
-
配列の重複: 参照された配列が値によって反復された場合、配列は次のように複製されました。反復中の変更が元の配列に影響を与えるのを防ぎます (たとえば、reset()、each() などの関数を使用する場合)。この不要な重複はパフォーマンスに影響を与えました。
-
IAP との干渉:reset() などの関数による IAP への変更は、必ずしも foreach ループに影響を与えるわけではありません。これにより、特定のシナリオで予期しない動作が発生する可能性があります。
PHP 7
PHP 7 では、foreach 実装に大幅な改善が導入されました。最も注目すべき変更は、単一の IAP を置き換える 外部ハッシュテーブル イテレータ の導入です。
-
外部ハッシュテーブル: 各 foreach ループは独自の外部ハッシュテーブルを維持します。イテレーター。この反復子は、反復される配列またはオブジェクト内の現在位置およびその他の関連情報を追跡します。これらの独立した反復子のおかげで、foreach ループは基礎となる配列の IAP を変更しなくなり、干渉の問題がなくなりました。
-
配列の重複なし: PHP 7 では、配列の値による反復は行われません。重複が含まれます。ループ中にアレイが変更された場合、オンデマンドでクローンが作成されます (コピーオンライト メカニズムに従って)。これにより、PHP 5 の不必要な重複と比較してパフォーマンスが大幅に向上します。
動作への影響
PHP 7 の foreach 実装の変更により、PHP 7 の foreach 実装と比較して動作にいくつかの違いが生じています。 PHP 5:
-
配列の変更: PHP 5 では、値による foreach ループ中の参照配列への変更はループに反映されます。ただし、PHP 7 では、配列の値による反復は、ループ中に行われた変更に関係なく、常に元の要素で動作します。
-
IAP の変更: リセットなどの関数を使用して IAP を変更します。 () は、PHP 7 の foreach ループに直接影響しなくなりました。foreach は独自のイテレータを維持するため、外部からの変更の影響を受けません。 IAP.
使用上のガイドライン
foreach ステートメントの最適な使用法を確保し、潜在的な問題を回避するには、次のガイドラインを考慮してください。
- 可能な限り値による反復を優先します。これにより、追加の反復子の作成が回避され、パフォーマンスが向上します。
- 値による反復中の配列の変更に関しては、PHP 5 と PHP 7 の間での動作の変更に注意してください。
- 変更する場合は注意してください。特定の状況によっては予期しない動作が発生する可能性があるため、foreach ループ中に反復される配列またはオブジェクト。
以上がPHP の「foreach」ループは PHP 5 と PHP 7 でどのように動作が異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。