PHP Generator::send() 方法
PHP Generator::send()
方法用于将一个值发送给生成器。
( PHP 5 >= 5.5.0, PHP 7 )
方法原型
PHP Generator::send()
方法的原型如下
public mixed Generator::send ( mixed $value )
从原型中可以看出,调用该方法需要将一个值作为参数,然后返回一个值。
调用 Generator::send()
方法会将传递的值作为 yield 表达式的结果,然后继续执行生成器。直到遇到下一次 yield 时生成器停止并且返回 yield 的值。
如果调用此方法时生成器不在 yield
表达式中,那么在发送值之前,首先会运行生成器,直到遇到第一个 yield 表达式。因此调用此方法前没必要使用 Generator::next()
调用 「 启动 」 PHP 生成器。
从某些方面说,调用 Generator::next()
方法倒是有点类似于调用 Generator::send(NULL)
参数说明
参数 | 说明 |
---|---|
$value | 要发送到生成器的值。该值将是生成器当前所在的 yield 表达式的返回值 |
返回值
返回生成器当前 yield 的值,如果 yield 不对值做任何修改的话,返回的值就是传递的参数
范例
我们写一个范例简单的演示下 send() 方法的使用
<?php function printer() { echo "I'm printer!".PHP_EOL; while (true) { $string = yield; echo $string.PHP_EOL; } } $printer = printer(); $printer->send('Hello world!'); $printer->send('Bye world!');
运行上面这段代码,输出结果如下
I'm printer! after yield:Hello world! after yield:Bye world!
使用场景
我们可以使用 send()
来开启或停止一个永远可运行的生成器
<?php function nums() { for ($i = 0; $i < 1000000; ++$i) { //从调用中获取一个值 $cmd = (yield $i); if($cmd == 'stop') return;// 终止生成器 } } $gen = nums(); foreach($gen as $v) { if( $v == 3 ) $gen->send('stop'); echo "{$v}\n"; }
运行结果如下
0 1 2 3