起因
http://www.oschina.net/translate/cooperative-multitasking-using-coroutines-in-php
没看懂
<?php
var_dump($gen->send('ret1')); //输出是 yield2 不理解为什么
<div>
</div>
<p>
<br>
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();
var_dump( $gen->current());// 0
$gen->next();
var_dump( $gen->current());// 1
$gen->next();
$gen->rewind(); // 我以为这里 会将指针 回归到 0 可是报错
PHP Fatal error: Uncaught exception 'Exception' with message 'Cannot rewind a generator that was already run' in /var/www/html/learn.php:28
Stack trace:
#0 /var/www/html/ams/learn.php(28): Generator->rewind()
#1 {main}
thrown in /var/www/html/ams/learn.php on line 28
<p></p>
<p>
var_dump( $gen->current());// 我以为会输出 0 <br>
</p>
<p>
</p>
<p></p>
<p style="font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;font-size:14px;vertical-align:baseline !important;background:none #FFFFFF !important;">
<span style="line-height:16.7999992370605px;"></span>
</p>
<div>
<br>
</div>
请老师教我
第一个问题:send后会从第一个yield执行到第二个yield,然而第二个yield有值所以就直接返回“yield2”
第二个问题:如果generator已经开始rewind方法会异常,官方有说明(http://php.net/manual/en/generator.rewind.php)
1.var_dump($gen->send('ret1')); //输出是 yield2 不理解为什么
没用过yield,现研究了一下,你使用send方法相当于调用了一次next,如果你在使用send方法之前使用current()就会输出yield1
在你给出的那篇文章也提到了这个问题,相当于隐含调用了一次ewind
2.$gen->rewind();//我以为这里会将指针回归到0可是报错
第二个问题,这可能属于使用yield的条件,你的yield是使用在一个循环里,一个循环作为一个完整的yield包装是不能被rewind的.因为yield在循环里只出现了一次,而且没有generate完毕,所以它会告诉你这个生成器还在使用.
3.var_dump($gen->current());//我以为会输出0
这里是应该输出0,难道不是?我这里没有环境没办法测试结果.
yield这玩意确实不太直观不太容易理解.
http://www.laruence.com/2015/05/28/3038.html
看这篇吧.反正这些技术就是让PHP跌出排行榜前十...
不服来约.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。