ホームページ >バックエンド開発 >PHPチュートリアル >PHPマスター| PHPのジェネレーター
コアポイント
yield
の代わりにreturn
キーワードを使用して、その状態を保存し、再び呼び出されたときに割り込みから続行します。 send()
メソッドを呼び出すことで外部値を返して受信する関数です。また、ジェネレーターデリゲートと呼ばれる別のジェネレーターでも使用できます。 Iteratorsに関する私の以前の記事に従えば、イテレーションは重要なプログラミングの概念であることがわかりますが、反復可能なオブジェクトを作成するために必要なインターフェイスを実装することは、多くのボイラープレートコードが必要なため、せいぜい面倒です。 PHP 5.5のリリースにより、ついにジェネレーターができました!この記事では、ジェネレーターについて学びます。これは、イテレーターインターフェイスのオーバーヘッドまたは複雑さなしに簡単なイテレーターを簡単に実装する方法を提供します。
ジェネレーターの仕組み
ウィキペディアの定義によれば、ジェネレーターは「発電機に呼び出され、一連の値を生成できるパラメーターがあるため、配列を返す関数に非常に似ています」。発電機は基本的に正常な関数ですが、値を返す代わりに、必要な数の値を生成します。関数のように見えますが、イテレーターのように動作します。ジェネレーターは、yield
の代わりにreturn
キーワードを使用します。値を関数の呼び出し元に返すため、return
と同様に機能しますが、yield
はスタックから関数を削除せず、状態を保存します。これにより、関数が割り込みから実行を継続できます。実際、ジェネレーターから値を返すことはできませんが、値なしでreturn
で実行を終了できます。 PHPマニュアルには、「ジェネレーター関数が呼び出されると、これはフォワードオブジェクトと同じ方法でイテレーターインターフェイスを実装する内部ジェネレータークラスのオブジェクトを返します。オブジェクトを繰り返すと、PHPが値が必要になるたびに発電機を呼び出します。ジェネレーターが値を生成すると、状態は保存され、次の値が必要なときに復元できるようにします。
<code class="language-php"><?php function nums() { echo "The generator has started\n"; for ($i = 0; $i < 5; $i++) { yield $i; echo "Yielded $i\n"; } echo "The generator has ended\n"; } foreach (nums() as $v); ?></code>
上記のコードの出力は次のとおりです
<code>The generator has started Yielded 0 Yielded 1 Yielded 2 Yielded 3 Yielded 4 The generator has ended</code>
私たちの最初のジェネレーター
ジェネレーターは、C#、Python、JavaScript、Rubyなどの言語に既に存在し、通常はキーワードを使用して認識されます。 Pythonの例は次のとおりです
yield
<code class="language-python">def file_lines(filename): file = open(filename) for line in file: yield line file.close() for line in file_lines('somefile'): #do some work here</code>
<code class="language-php"><?php function nums() { echo "The generator has started\n"; for ($i = 0; $i < 5; $i++) { yield $i; echo "Yielded $i\n"; } echo "The generator has ended\n"; } foreach (nums() as $v); ?></code>
ジェネレーター関数はファイルを開き、必要に応じてファイルの各行を生成します。発電機が呼び出されるたびに、割り込みから実行され続けます。 yield
ステートメントが実行されると、その状態が保存されるため、ゼロから開始しません。すべての行が読み取られると、ジェネレーターは単に終了し、ループが終了します。
キーを返します
PHP Iteratorは、キー/値のペアで構成されています。この例では、1つの値のみが返されるため、キーは数字です(デフォルトではキーは数字です)。関連するペアを返したい場合は、yield
ステートメントを変更して、配列構文を使用してキーを含めるだけです。
<code>The generator has started Yielded 0 Yielded 1 Yielded 2 Yielded 3 Yielded 4 The generator has ended</code>
注入値
yield
値を返すだけではありません。これは、渡す値でジェネレーターオブジェクトのsend()
メソッドを呼び出すことによって行われます。この値を使用して、他の操作を計算または実行できます。このメソッドは、yield
式の結果としての値をジェネレーターに送信し、実行を再開します。
<code class="language-python">def file_lines(filename): file = open(filename) for line in file: yield line file.close() for line in file_lines('somefile'): #do some work here</code>
出力は次のとおりです
<code class="language-php"><?php function file_lines($filename) { $file = fopen($filename, 'r'); while (($line = fgets($file)) !== false) { yield $line; } fclose($file); } foreach (file_lines('somefile') as $line) { // do some work here } ?></code>
ジェネレーターを使用してメモリを保存します
ジェネレーターは、大規模なコレクションを計算し、すべての結果にメモリを同時に割り当てたくない場合、またはすべての結果が必要かどうかわからない場合に役立ちます。結果の処理方法により、現在の結果に対してのみメモリを割り当てることにより、メモリの使用量を非常に低いレベルに減らすことができます。ファイル内のすべての行を配列として返す関数を想像してください。 Lipsumを使用して生成された同じランダム100セグメントテキストファイルを使用して、file()
関数とデモfile()
関数の単純なベンチマークを実行します。結果は、file_lines()
関数が最大で110倍のジェネレーターを使用していることを示しています。 file
<code class="language-php"><?php function file_lines($filename) { // ... yield $key => $line; // ... } foreach (file_lines('somefile') as $key => $line) { // do some work here } ?></code>
結論
ジェネレーターの導入により、PHPは開発者に強力なツールを提供します。多くのメモリを保存しながら、迅速にイテレーターを書くことができます。このチュートリアルを通して、プロジェクトで自分で使用を開始するのに十分な知識を得ていることを願っています。個人的には、私はすでに書き直すべき多くのオブジェクトを考えてきました。アイデアやコメントがある場合は、コメントを残してください。PHPジェネレーターのFAQ
(元のテキストにリストされているFAQをここに含める必要があります。スペースの制限のために、ここで省略されています。)
以上がPHPマスター| PHPのジェネレーターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。