©
Ce document utilise Manuel du site Web PHP chinois Libérer
(PHP 5 >= 5.5.0)
Generator::send — 向生成器中传入一个值
$value
)向生成器中传入一个值,并且当做 yield 表达式的结果,然后继续执行生成器。
如果当这个方法被调用时,生成器不在 yield 表达式,那么在传入值之前,它会先运行到第一个 yield 表达式。As such it is not necessary to "prime" PHP generators with a Generator::next() call (like it is done in Python).
value
传入生成器的值。这个值将会被作为生成器当前所在的 yield 的返回值
返回生成的值。
Example #1 用 Generator::send() 向生成器函数中传值
<?php
function printer () {
while ( true ) {
$string = yield ;
echo $string ;
}
}
$printer = printer ();
$printer -> send ( 'Hello world!' );
?>
以上例程会输出:
Hello world!
[#1] kexianbin at diyism dot com [2015-09-29 06:47:27]
an example:
$coroutine=call_user_func(create_function('', <<<'fun_code'
echo "inner 1:\n";
$rtn=(yield 'yield1');
echo 'inner 2:';var_export($rtn);echo "\n";
$rtn=(yield 'yield2');
echo 'inner 3:';var_export($rtn);echo "\n";
$rtn=(yield 'yield3');
echo 'inner 4:';var_export($rtn);echo "\n";
fun_code
));
echo ":outer 1\n"; // :outer 1
var_export($coroutine->current());echo ":outer 2\n"; // inner 1:, 'yield1':outer 2
var_export($coroutine->current());echo ":outer 3\n"; // 'yield1':outer 3
var_export($coroutine->next());echo ":outer 4\n"; // inner 2:NULL, NULL:outer 4
var_export($coroutine->current());echo ":outer 5\n"; // 'yield2':outer 5
var_export($coroutine->send('jack'));echo ":outer 6\n"; // inner 3:'jack', 'yield3':outer 6
var_export($coroutine->current());echo ":outer 7\n"; // 'yield3':outer 7
var_export($coroutine->send('peter'));echo ":outer 8\n"; // inner 4:'peter', NULL:outer 8
[#2] sergei dot solomonov at gmail dot com [2013-10-08 18:30:38]
<?php
function foo() {
$string = yield;
echo $string;
for ($i = 1; $i <= 3; $i++) {
yield $i;
}
}
$generator = foo();
$generator->send('Hello world!');
foreach ($generator as $value) echo "$value\n";
?>
This code falls with the error:
PHP Fatal error: Uncaught exception 'Exception' with message 'Cannot rewind a generator that was already run'.
foreach internally calls rewind, you should remember this!
[#3] sfroelich01 at sp dot gm dot ail dot am dot com [2013-07-17 12:11:41]
Reading the example, it is a bit difficult to understand what exactly to do with this. The example below is a simple example of what you can do this.
<?php
function nums() {
for ($i = 0; $i < 5; ++$i) {
//get a value from the caller
$cmd = (yield $i);
if($cmd == 'stop')
return;//exit the function
}
}
$gen = nums();
foreach($gen as $v)
{
if($v == 3)//we are satisfied
$gen->send('stop');
echo "{$v}\n";
}
//Output
0
1
2
3
?>