开发者社区> 问答> 正文

php 技术 yield 问题?报错

起因 

http://www.oschina.net/translate/cooperative-multitasking-using-coroutines-in-php

没看懂

<?php

 
function gen() {
    $ret= (yield'yield1');
    $ret= (yield'yield2');
}
 
$gen= gen();

var_dump($gen->send('ret1')); //输出是 yield2  不理解为什么




<?php
<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>



请老师教我







展开
收起
爱吃鱼的程序员 2020-06-14 15:45:49 978 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    第一个问题: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跌出排行榜前十...

    不服来约.

    2020-06-14 15:46:06
    赞同 展开评论 打赏
问答分类:
PHP
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载