Php 右边的变量在收益率表达式中起什么作用?

Php 右边的变量在收益率表达式中起什么作用?,php,Php,根据PHP文档,生成器类的::send()方法中传递的变量被分配给yield关键字 这在以下陈述中是有意义的: $v=收益率 但是,下面的陈述是什么呢 $v=收益率$a <?php $engine = function($callback) { $i = 0; while (true) { $state = (yield $callback($i++)); if ($state == 'stop') { return

根据PHP文档,生成器类的
::send()
方法中传递的变量被分配给yield关键字

这在以下陈述中是有意义的:

$v=收益率

但是,下面的陈述是什么呢

$v=收益率$a

<?php
$engine = function($callback) {
    $i = 0;
    while (true) {
        $state = (yield $callback($i++));
        if ($state == 'stop') {
            return $i;
        }
    }
};

$generator = $engine(function($i) {
    return $i;
});

foreach ($generator as $value) {
    echo "{$generator->key()} = {$value}\n";

    if ($generator->key() == 10) {
        $generator->send('stop');
    }
}

echo 'Stopped on: '.$generator->getReturn();
yield关键字已分配,它将返回传递给的变量。那么,
$a
做什么呢


我试图弄明白这一点,搜索了许多帖子和问题,但没有一个能解释这一点。

我自己回答

$v=收益率$a

也就是说,首先像通常一样生成$a,然后将send()方法传递的变量赋值给$v

仍然无法得到清楚的解释。但我认为这在某种程度上是这个问题的答案。

使用
send()
将定义
$v
,因此如果使用
$v=yield$a
你很难理解,所以这里有一个例子,它创建了两个部分,foreach迭代器在生成器上循环,然后在迭代10中它向while循环发送一个停止。然后使用getReturn获取收益率的最后一个值,如
$v=yield$a中的
$v

<?php
$engine = function($callback) {
    $i = 0;
    while (true) {
        $state = (yield $callback($i++));
        if ($state == 'stop') {
            return $i;
        }
    }
};

$generator = $engine(function($i) {
    return $i;
});

foreach ($generator as $value) {
    echo "{$generator->key()} = {$value}\n";

    if ($generator->key() == 10) {
        $generator->send('stop');
    }
}

echo 'Stopped on: '.$generator->getReturn();

yield
关键字可用于三件事:

  • 就其本身而言,将控制权临时返回给调用代码。这是所有其他用途的基础
  • 在(
    yield$foo
    )后面加一个值,将变量传递给调用代码
  • 使用前面的赋值(
    $bar=yield
    ),从调用代码接收变量
这些类似于如何使用函数调用:

  • 它本身,如
    doSomething()
    ,将控制权临时传递给
    doSomething
    的定义
  • 使用参数,如
    doSomething($foo)
    ,将变量传递给函数
  • 使用前面的赋值,如
    $var=doSomething()
    ,从函数接收变量
希望您非常熟悉编写
$bar=doSomething($foo)
$foo
传递给函数,然后取出
$bar
$bar=yield$foo
类似,但该值被“传出”到调用代码,随后从调用代码接收到新值


$foo
$bar
没有任何连接,它们只是特定
产量的输入和输出。在调用代码中,
yield$foo
$bar=yield$foo
$foo
部分可以通过调用
->next()
->current()
或获取
foreach
中的值来访问。调用代码然后调用
->send()
,其中的某个值成为
$bar=yield
$bar=yield$foo

中的
$bar
,之后,代码将运行到该点之外。请查看(PHP7中不需要使用
收益率$i
周围的括号)@DanMiller我读过那页。在你引用的代码中附加$I到底是做什么的?@ka_lin我不怀疑。只要看看dan刚刚链接的那页。@Chyaamoo
$I
是从生成器中产生的值,
$cmd
是传递给里面的值,这样你就可以在每次迭代中对里面发生的事情有更多的控制权。Using
send()
定义
$v
无论您是否使用
$v=yield$a;
,在第二次迭代时,
$v
将设置为
$a
@LawrenceCherone-Hmm…我不明白。您的意思是,这个$a是堆叠起来分配的。