この記事では主に PHP イテレータ ジェネレータの紹介を紹介しますが、これは参考になると思います。今回はそれを共有します。必要な友人は参考にしてください。
イテレーションプロセスを繰り返し実行することを指し、各実行はイテレーションと呼ばれます。たとえば、通常の走査は反復です。
$arr = [1, 2, 3, 4, 5];foreach($arr as $key => $value) { echo $key . ' => ' . $value . "\n";}
foreach
が配列を走査し、その内容を繰り返し出力していることがわかります。 foreach
内で、各反復は現在の要素の値を $value
に割り当て、配列ポインターを次の要素に移動して次の反復に備えます。これにより、シーケンスのトラバースが実現されます。外部関数が自身の内部データを反復できるようにするインターフェイスは Iterator インターフェイス
であり、対応する反復された自己は Iterator オブジェクト
です。
PHP は、統一されたイテレータ インターフェイスを提供します。
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 boolean valid(void)}
Iterator インターフェイス
を実装することにより、オブジェクトをトラバースする方法を自分で決定できます。
Foreach が機能するのは、これらのコレクション クラスがすべて Iterator の生成メソッドを定義する Iterable インターフェイスを実装しており、foreach が Iterable インターフェイスを通じてシーケンス内を移動するためです。
イテレーターと比較して、ジェネレーターは、パフォーマンスのオーバーヘッドと複雑さが少なく、単純な オブジェクト反復
を実装する簡単な方法を提供します。
ジェネレーター関数は通常の関数のように見えます。違いは、通常の関数が値を返すのに対し、ジェネレーターは yield
多くの値を生成でき、それぞれの生成は一時停止するだけであることです。この状態にある場合、次回ジェネレーター関数が呼び出されたときに、PHP は最後に一時停止された状態から実行を継続します。
ジェネレーターを使用すると、生成された値に対応するキー名を連想配列のように指定できます。次のようにキーと値のペアを生成することは、連想配列を定義することと似ています。
function xrange($start, $limit, $step = 1) { for ($i = $start, $j = 0; $i <= $limit; $i += $step, $j++) { // 给予键值 yield $j => $i; } }$xrange = xrange(1, 10, 2);foreach ($xrange as $key => $value) { echo $key . ' => ' . $value . "\n";}
最初に概念を明確にします: ジェネレーターの yield キーワードは戻り値ではなく、専門用語では出力値と呼ばれ、値を生成するだけです。実際、ジェネレーター関数は Generator
オブジェクトを返しますが、これは new を通じてインスタンス化できず、Iterator
インターフェイスを実装します。
では、コード foreach のループは何でしょうか? PHP がジェネレーターを使用すると、クラス Generator のオブジェクトが返されます。 foreach オブジェクトは反復可能です。反復ごとに、PHP は Generator インスタンスを通じて次に反復する必要がある値を計算します。このようにして、foreach は次に反復する必要がある値を知ることができます。
また、動作中は、for はループ実行直後に停止します。次のループ中に foreach が for に次の値を再度要求するまで待機し、ループが再度実行されます。そしてすぐに再び停止します。条件が満たされない限り実行されません。
#ジェネレーターの利点
毎回メモリにロードされるテキストは 1 行だけです、メモリ使用量が大幅に削減されます。
<?php header("content-type:text/html;charset=utf-8"); function readTxt() { # code... $handle = fopen("./test.txt", 'rb'); while (feof($handle)===false) { # code... yield fgets($handle); } fclose($handle); } foreach (readTxt() as $key => $value) { # code... echo $value.'<br />'; }
PHP は Azure Storage Blob を使用してファイルをアップロードします
PHP で他のインターフェイスをリクエストする Curl の概要インターフェース# ########
以上がPHP イテレータ ジェネレータの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。