ジェネレータ関数を最初に呼んだときに、 Generator クラスのオブジェクトが返されます。 このオブジェクトは Iterator インターフェイスを実装しており、前進しかできないイテレータとほぼ同じようになっています。
Generator クラスのメソッドのほとんどは Iterator インターフェイスのメソッドと同じ構文です。 しかし Generator オブジェクトには、もうひとつ send() メソッドが追加されています。
Generator オブジェクトのインスタンスを new で作ることはできません。
例1 Generator クラス
<?php
class Generator implements Iterator {
public function rewind(); // イテレータを巻き戻します。
// すでに反復処理が始まっている場合は
// 例外をスローします。
public function valid(); // イテレータが閉じた後は
// false を返し、それ以外の場合は
// true を返します。
public function current(); // yield した値を返します。
public function key(); // yield したキーを返します。
public function next(); // ジェネレータの実行を続けます。
public function send($value); // 指定した値を
// yield の結果としてジェネレータに送信し、
// ジェネレータの実行を続けます。
}
?>
Generator::send() は、 値をジェネレータ関数に注入して反復処理を進めます。 注入された値を返すには yield 文を使います。 これを、ジェネレータ関数の中で他の変数と同じように使えます。
例2 Generator::send() による値の注入
<?php
function printer() {
while (true) {
$string = yield;
echo $string;
}
}
$printer = printer();
$printer->send('Hello world!');
?>
上の例の出力は以下となります。
Hello world!