ジェネレーター関数は通常の関数のように見えますが、違いは、ジェネレーターが単一の値を返すのではなく、オンデマンドで複数の値を生成することです。
ジェネレーター関数が呼び出されると、反復処理を行うと反復可能なオブジェクトが返されます。そのオブジェクトを (たとえば、foreach ループを通じて)、PHP は値が必要になるたびにジェネレーター関数を呼び出し、ジェネレーターが値を生成すると、次回のためにジェネレーターの状態を保存し、値を復元できます。必要に応じて。
それ以上値が生成されない場合、ジェネレーター関数は単に終了でき、配列がすべての値を使い果たしたかのように呼び出しコードが続行されます。
注:
ジェネレーターは値を返すことができません。ジェネレータ内の空の return ステートメントは有効な構文であり、ジェネレータ関数の中心となるのは、yield ステートメントです。 return ステートメントと似ていますが、値を返して実行を停止する代わりに、yield はジェネレーターを参照するコードに値を提供し、その後ジェネレーターの実行を一時停止します。
例 #1 値を返す簡単な例
<?php function gen_one_to_three() { for ($i = 1; $i <= 3; $i++) { // Note that $i is preserved between yields. yield $i; } } $generator = gen_one_to_three(); foreach ($generator as $value) { echo "$value\n"; } ?>
上記のルーチンは次の出力を行います:
1 2 3
注:
内部的には、非連想配列と同様に、シリアル化された整数キーが出力値とペアになります。
注意 コンテキスト式を使用する場合、yield を使用する場合 (たとえば、たとえば、次のコードは正しいです:
$data = (yield $value);
しかし、次のコードは解析エラーになります。発生しました:
$data = yield $value;
この構文はジェネレーター オブジェクトの send() メソッドで使用できます
キーを使用して値を取得します
PHP は連想配列をサポートしており、ジェネレーターについても同様です。上に示したように、単純な値を生成するだけでなく、同時にキーを生成することもできます
キーと値のペアを生成するための構文は、以下に示すように、連想配列の定義に使用できます。例 #2 キーと値のペアを生成する
<?php /* The input is semi-colon separated fields, with the first * field being an ID to use as a key. */ $input = <<<'EOF' 1;PHP;Likes dollar signs 2;Python;Likes whitespace 3;Ruby;Likes blocks EOF; function input_parser($input) { foreach (explode("\n", $input) as $line) { $fields = explode(';', $line); $id = array_shift($fields); yield $id => $fields; } } foreach (input_parser($input) as $id => $fields) { echo "$id:\n"; echo " $fields[0]\n"; echo " $fields[1]\n"; } ?>
上記のルーチンは次のように出力します:
1: PHP Likes dollar signs 2: Python Likes whitespace 3: Ruby Likes blocks
注意: コンテキスト式でキーと値のペアを生成するには、yield ステートメントを で囲む必要があります。括弧:
$data = (yield $key => $value);
null 値を生成する
Yield は、自動生成されたキーを使用して NULL 値を生成するために引数なしで呼び出すことができます。
例 #3 NULL を生成する
<?php function gen_three_nulls() { foreach (range(1, 3) as $i) { yield; } } var_dump(iterator_to_array(gen_three_nulls())); ?>
上記のルーチンは次のように出力します。参照による
ジェネレーター関数は参照による値を生成できます。これは、関数名の前に & を追加することで、関数から参照を返すのと同じです。
例 #4 参照による値の生成
array(3) { [0]=>NULL [1]=>NULL [2]=>NULL }
上記ルーチンは次のように出力します:
<?php function &gen_reference() { $value = 3; while ($value > 0) { yield $value; } } /* 注意我们可以在循环中改变$number * because the generator is yielding references, $value * within gen_reference() changes. */ foreach (gen_reference() as &$number) { echo (--$number).'... '; } ?>