とはyield
?
yield
キーワードは、ジェネレーター関数からデータを返します。
ジェネレーター関数の核心は yield キーワードです。最も単純な形式では、yield ステートメントは return ステートメントによく似ていますが、関数の実行を停止して戻るのではなく、yield がジェネレーターをループするコードに値を提供し、ジェネレーター関数の実行を一時停止する点が異なります。
ジェネレータ関数とは何ですか?
ジェネレーター関数は、事実上、 Iteratorを記述するよりコンパクトで効率的な方法です。ループしている間に値を計算して返す関数 ( your xrange
)を定義できます。
function xrange($min, $max) {
for ($i = $min; $i <= $max; $i++) {
yield $i;
}
}
[…]
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
これにより、次の出力が作成されます。
0 => 1
1 => 2
…
9 => 10
を使用して を$key
制御することもできますforeach
yield $someKey => $someValue;
ジェネレーター関数で$someKey
は、 は表示したいもので$key
あり$someValue
、 の値です$val
。質問の例では、$i
.
通常の機能との違いは何ですか?
range
ここで、PHP のネイティブ関数を単純に使用してその出力を実現しない理由を不思議に思うかもしれません。そして、あなたはそうです。出力は同じになります。違いは、そこにたどり着いた方法です。
range
PHPを使用すると、それが実行され、メモリ内に数値の配列全体が作成され、return
その配列全体がforeach
ループに渡されて、値が出力されます。つまり、foreach
は配列自体に作用します。そのrange
機能とは、foreach
一度だけ「話す」こと。郵便で小包を受け取るようなものだと考えてください。配達員が荷物を渡して出発します。そして、パッケージ全体を開いて、そこにあるものをすべて取り出します。
ジェネレーター関数を使用すると、PHP は関数にステップ インし、最後またはyield
キーワードに到達するまで実行します。を満たすと、yield
その時点での値を外側のループに返します。次に、ジェネレーター関数に戻り、生成された場所から続行します。あなたはループをxrange
保持しているので、到達for
するまで実行して譲歩します。と発電機がピンポンをし$max
ているようなものだと考えてください。foreach
なぜそれが必要なのですか?
明らかに、ジェネレーターを使用してメモリ制限を回避できます。環境によっては、 a を実行するrange(1, 1000000)
とスクリプトが致命的になりますが、ジェネレーターを使用しても問題なく動作します。またはウィキペディアが言うように:
ジェネレーターは生成された値をオンデマンドでのみ計算するため、一度に計算するのが高価または不可能なシーケンスを表すのに役立ちます。これらには、無限シーケンスやライブ データ ストリームなどがあります。
ジェネレーターもかなり高速であると想定されています。ただし、高速について話しているときは、通常、非常に少数で話していることに注意してください。したがって、実行してジェネレーターを使用するようにすべてのコードを変更する前に、ベンチマークを実行して、それが意味のある場所を確認してください。
ジェネレーターのもう 1 つのユース ケースは、非同期コルーチンです。yield
キーワードは値を返すだけでなく、値を受け入れます。詳細については、以下にリンクされている 2 つの優れたブログ記事を参照してください。
いつから使えyield
ますか?
ジェネレーターはPHP 5.5で導入されました。そのバージョンより前のバージョンを使用しようとするとyield
、キーワードに続くコードに応じて、さまざまな解析エラーが発生します。したがって、そのコードから解析エラーが発生した場合は、PHP を更新してください。
ソースと参考資料: