この記事は、PHP におけるイテレーターとジェネレーターの長所と短所を分析して紹介したものです。一定の参考価値があります。困っている友人が参考になれば幸いです。助けます。
1. イテレータ
分析: コレクション オブジェクトと操作をコレクション オブジェクト一緒に、別の方法でコレクション オブジェクト内の要素をトラバースしたい場合は、コレクション オブジェクトを変更する必要がありますが、これは「単一責任の原則」に違反し、イテレータ パターンによってデータ構造とデータのアルゴリズムが分離されます。構造になっており、両者は独立して開発できます。
利点:
1. 複数の走査方法をサポートします。たとえば、順序付きリストでは、必要に応じて、順方向トラバーサルと逆方向トラバーサル用の 2 つの反復子を提供します。ユーザーは、コレクションに対して走査操作を実行するためにイテレータを取得するだけで済みます。
2. 簡素化された集約クラス。イテレータの導入により、元のコレクション オブジェクトはそれ自体でコレクション要素をトラバースする必要がなくなりました。
3. 新しい集計クラスとイテレータ クラスを追加すると非常に便利で、2 つのディメンションを個別に変更できます。
4. 異なるコレクション構造に統一インターフェイスを提供することで、異なるコレクション構造で動作する同じアルゴリズムをサポートします
欠点:
1.反復反復子パターンは、データの保存とデータの走査の役割を分離します。新しいコレクション オブジェクトを追加するときは、対応する反復子クラスを追加する必要があります。クラスの数はペアで増加するため、システムの複雑さがある程度増加します。
特定のインターフェイス:
Iterator extends Traversable { /* 方法 */ abstract public mixed current ( void ) abstract public scalar key ( void ) abstract public void next ( void ) abstract public void rewind ( void ) abstract public bool valid ( void ) }
2. ジェネレーター
PHP ジェネレーター (ジェネレーター) は、PHP5.5.0 で導入された機能です。標準の PHP イテレーターとは異なり、PHP ジェネレーターは、必要ありません クラスは Iterator インターフェイスを実装しているため、クラスの負担が軽減されます ジェネレータは要件に応じて反復される値を計算して出力します これはパフォーマンスに大きな影響を与えます 標準的な PHP イテレータが頻繁に実行される場合を想像してくださいデータセットの事前計算はパフォーマンスが低くなります。特定の方法を使用して大量のデータを計算すると、パフォーマンスへの影響はさらに大きくなります。このとき、ジェネレーターを使用すると、貴重なメモリ リソースを占有することなく、後続の値を即座に計算して出力できます。
利点: メモリ使用量が少なく、パフォーマンスが優れています。ジェネレーターの内部状態は、値を生成するたびに一時停止され、ジェネレーターが次の値を要求すると復元されます。ジェネレーターの内部は、ループが完了するか一時停止位置に達するまで、一時停止と再開を切り替え続けます。
欠点:
1. PHP ジェネレーターは、すべてのイテレーターのニーズを満たすことができません。はクエリされず、ジェネレータは次に反復処理する値が何であるかを決して知りません。ジェネレータ内で前後に進む方法はありません。
2. ジェネレーターは依然として 1 回限りであり、同じジェネレーターを複数回繰り返すことはできませんが、必要に応じてジェネレーターを再構築または複製することができます。
ジェネレーターの作成:
1. ジェネレーターは PHP 関数であるため、ジェネレーターは関数内で yield キーワードを使用します。通常の PHP 関数とは異なり、プロデューサーは値を返すことはなく、値を生成するだけです。
<?php function myGenerator(){ yield 'a'; yield 'b'; yield 'c'; }
2. ジェネレーター関数を呼び出すと、PHP は Generator クラスに属するオブジェクトを返します。このオブジェクトは、foreach() 関数を使用して反復できます。反復ごとに、PHP はジェネレーター インスタンスに、反復される次の値を計算して提供するように要求します。
<?php function makeRange($length){ for($i = 0; $i<$length; $i++){ yield $i; } } foreach(makeRange(1000000) as $i){ echo $i,PHP_EOL; }
上に示すように: $length が大きく (数百万)、同時にジェネレーターを使用していない場合次に、100 万から 1,000 の整数で構成される配列にメモリを事前に割り当てる必要があります。 PHP ジェネレーターでも同じ操作を実現できますが、一度に 1 つの整数にのみメモリを割り当てます
関連推奨事項:
php はビット演算を使用して加算、減算、乗算を実装します。整数の除算とテスト (コード例)
以上がPHP のイテレータとジェネレータの分析とその利点と欠点の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。