这是一个简单的 JavaScript生成器(来自: http://blog.carbonfive.com/2013/12/01/hanging-up-on-callbacks-generators-in-ecmascript-6/)
function* powGenerator() {
  var result = Math.pow(yield "a",yield "b");
  return result;
}

var g = powGenerator();
console.log(g.next().value);   // "a",from the first yield
console.log(g.next(10).value); // "b",from the second
console.log(g.next(2).value);  // 100,the result

我正在尝试使用类似于PHP的模型,但这有点令人头疼.

<?PHP
function powGenerator() {
  return pow((yield 'a'),(yield 'b'));
}

在我走得更远之前,我在PHP中遇到了这个错误

Fatal error: Generators cannot return values using “return”

好吧,也许我会用另一个产量来获得最终价值? …

<?PHP
function powGenerator() {
  yield pow((yield 'a'),(yield 'b'));
}

$g = powGenerator(); //=> Generator {#180}
echo $g->send(10);   //=> "b"
echo $g->send(2);    //=> 100

好的,所以我恢复了价值,但这里有两个主要问题

>我的“a”去了哪里? – 注意在JS示例中,我能够访问“a”和“b”产生的值以及100个最终结果.
>发电机还没有完成! – 我必须拨打额外的时间来完成发电机

$g->valid();   //=> true
$g->send('?'); //=> null
$g->valid();   //=> false

来自PHP Generator::send

public mixed Generator::send ( mixed $value )

Sends the given value to the generator as the result of the current yield expression and resumes execution of the generator.

If the generator is not at a yield expression when this method is called,it will first be let to advance to the first yield expression before sending the value. As such it is not necessary to “prime” PHP generators with a 07002 call (like it is done in Python).

强调“因此没有必要使用Generator :: next()来”启动“PHP生成器”.好的,但这究竟意味着什么?我没有像JavaScript示例那样“填充”它,但是第一个产生的值也被吞噬了.

任何人都可以解释你是如何在不使用foreach的情况下逐步完成生成器的吗?

第一个产生的价值没有被吞噬,你只是从来没有看过它.
$g = powGenerator();
echo $g->current(); //a

你然后两次发送值并恢复执行,$g-> valid()在此之后为真,因为你没有在第三次收益后恢复 – 发电机不完整而且可能还有更多要做的事情.考虑:

function powGenerator() {
    yield pow((yield 'a'),(yield 'b'));
    echo "Okay,finishing here Now!\n";
}

$g = powGenerator();
echo $g->current(),"\n"; //a
echo $g->send(10),"\n";  //b
echo $g->send(2),"\n";   //100
$g->next();               // Resumes execution of the generator,// which prints its own message and completes.
var_dump($g->valid());    //false

这个’输出:

a
b
100
Okay,finishing here Now!
bool(false)

现在在PHP 7中你可以return from a generator.

function powGenerator() {
    return pow((yield 'a'),(yield 'b'));
    echo "This will never print.";
}

$g = powGenerator();
echo $g->current(),"\n";   // Prints just the newline,you're moving on
                          // to a return which you must get explicitly.
var_dump($g->valid());    // Generator complete,you're free to get the return.
echo $g->getReturn(),"\n";

哪个输出:

a
b

bool(false)
100

至于在没有foreach的情况下单步执行它们 – Generator实现了Iterator,所以它有适当的方法来处理它:current,key,next,rewind和valid.有一点需要注意,如果你调用它,它将引发异常已经开始的发电机.

这样做的一个例子也演示了PHP 7的新generator delegation:

function letterGenerator() {
    yield from range('a','z');
}

$g = letterGenerator();

while ($g->valid()) {
    echo $g->current();
    $g->next();
}

输出:

abcdefghijklmnopqrstuvwxyz

如何在没有foreach的情况下使用PHP生成器?的更多相关文章

  1. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  2. swift学习2 元组 tuples

    swift中出现了一种新的数据结构,非常牛掰的元组tuples如果懂PHP的猿,会发现这个元组和PHP的数组非常类似,同样是可以默认不指定key,也可以指定key目前的学习疑问是,如何进行元组的遍历?

  3. 尝试使用swift mailer,gmail smtp,php发送邮件

    这里是我的代码:在运行时出现此错误…

  4. 离子运行android似乎工作,但该应用程序没有在手机上启动,为什么?

    我的手机处于打开状态,处于调试模式,我已通过adbdevices-l确认了这一点.当我运行离子运行android时,我得到Ionic声称应用程序启动时的输出,但手机上没有任何反应.我使用Android4.4.4的Nexus5.androidapp中的index.html:解决方法键入离子信息并检查已安装的Cordova版本.如果你有v5.0.0现在需要一个新的插件,否则所有的http请求都被阻止.

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. jQuery的Cookie封装,与PHP交互的简单实现

    下面小编就为大家带来一篇jQuery的Cookie封装,与PHP交互的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  8. 如何在PHP环境中使用ProtoBuf数据格式

    这篇文章主要介绍了如何在PHP环境中使用ProtoBuf数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  9. PHP rsa加密解密算法原理解析

    这篇文章主要介绍了PHP rsa加密解密算法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  10. PHP cookie与session会话基本用法实例分析

    这篇文章主要介绍了PHP cookie与session会话基本用法,结合实例形式分析了PHP cookie与session会话基本存储、设置、删除等相关使用方式,需要的朋友可以参考下

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部