PHP 7.1.0 Released

Generator::send

(PHP 5 >= 5.5.0, PHP 7)

Generator::sendEnvia um valor ao gerador

Descrição

public mixed Generator::send ( mixed $value )

Envia o valor informado ao gerador como resultado da expressão yield corrente e retorna a execução do gerador.

Se o gerador não estiver na expressão yield quando o método for chamado, primeiro será deixado avançar para a primeira expressão yield antes de enviar o valor. Assim como não é necessário "forçar" os geradores do PHP com uma chamada ao método Generator::next() (como é feito em Python).

Parâmetros

value

Valor a ser enviado ao gerador. Este valor será o retornado pela expressão yield em que o gerador estiver.

Valor Retornado

Retorna o valor gerado.

Exemplos

Exemplo #1 Usando o método Generator::send() para injetar valores

<?php
function printer() {
    while (
true) {
        
$string yield;
        echo 
$string;
    }
}

$printer printer();
$printer->send('Hello world!');
$printer->send('Bye world!');
?>

O exemplo acima irá imprimir:

Hello world!
Bye world!

add a note add a note

User Contributed Notes 3 notes

up
34
sfroelich01 at sp dot gm dot ail dot am dot com
3 years ago
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
?>
up
4
sergei dot solomonov at gmail dot com
3 years ago
<?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!
up
0
kexianbin at diyism dot com
1 year ago
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
To Top