ジェネレータ関数が初めて呼び出されるとき、内部 Generator クラスのオブジェクトが返されます。このオブジェクトは、フロント イテレータ オブジェクトとほぼ同じ方法で Iterator インターフェイスを実装します。
Generator クラスのメソッドのほとんどは Iterator インターフェイスのメソッドと同じセマンティクスを持ちますが、ジェネレーター オブジェクトには追加のメソッド send() があります。
注意Generator オブジェクトは new を通じてインスタンス化できません
例 #1ジェネレータークラス
<?php class Generator implements Iterator { public function rewind(); //Rewinds the iterator. 如果迭代已经开始,会抛出一个异常。 public function valid(); // 如果迭代关闭返回false,否则返回true. public function current(); // Returns the yielded value. public function key(); // Returns the yielded key. public function next(); // Resumes execution of the generator. public function send($value); // 发送给定值到生成器,作为yield表达式的结果并继续执行生成器. } ?>
Generator::send()
Generator::send()を使用すると、反復時にジェネレーターメソッドに値を注入できます。注入された値はyieldステートメントから返され、その後任意のジェネレーターメソッドで使用されます。
例 #2 Generator::send() を使用して値を挿入する
<?php function printer() { while (true) { $string = yield; echo $string; } } $printer = printer(); $printer->send('Hello world!'); ?>
上記のルーチンは次のように出力します:
Hello world!