php 技术 yield 问题

newbear 发布于 2015/05/29 18:36
阅读 2K+
收藏 0
PHP

起因 

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
 



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


var_dump( $gen->current());// 我以为会输出 0 




请老师教我







加载中
0
fieldinrain
fieldinrain

第一个问题:send后会从第一个yield执行到第二个yield,然而第二个yield有值所以就直接返回“yield2” 

第二个问题:如果generator已经开始rewind方法会异常,官方有说明(http://php.net/manual/en/generator.rewind.php)

0
甘薯
甘薯

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这玩意确实不太直观不太容易理解.

0
Tuesday
Tuesday

http://www.laruence.com/2015/05/28/3038.html

看这篇吧. 反正这些技术就是让PHP跌出排行榜前十...

不服来约.

返回顶部
顶部