Php 右边的变量在收益率表达式中起什么作用?
根据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
::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在迭代之前,您使用send()发送了一个值,它将生成您发送的值
你很难理解,所以这里有一个例子,它创建了两个部分,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
是传递给里面的值,这样你就可以在每次迭代中对里面发生的事情有更多的控制权。Usingsend()
定义$v
无论您是否使用$v=yield$a;
,在第二次迭代时,$v
将设置为$a
@LawrenceCherone-Hmm…我不明白。您的意思是,这个$a是堆叠起来分配的。