文字

Generator::send

(PHP 5 >= 5.5.0)

Generator::send向生成器中传入一个值

说明

public mixed Generator::send ( mixed $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
?>

上一篇: 下一篇: