PHP5.5迭代生成器用法实例详解


Posted in PHP onMarch 16, 2016

本文实例讲述了PHP5.5迭代生成器用法。分享给大家供大家参考,具体如下:

PHP5.5引入了迭代生成器的概念,迭代的概念早就在PHP有了,但是迭代生成器是PHP的一个新特性,这跟python3中的迭代生成器类似,看看PHP5.5的迭代生成器如何定义。

<?php
function xrange($start, $end, $step = 1) {
    for ($i = $start; $i <= $end; $i += $step) {
      yield $i;
    }
}
foreach (xrange(1, 1000000) as $num) {
    echo $num, "\n";
}

注意关键字:yield,正是这个yeild关键字构建了一个迭代器,这个函数xrange跟以往的函数的不同之处就在这里。一般情况都是return一个值,而yield一个值就表示这是个迭代器,每循环一次这个迭代器就生成这个值,故名为迭代生成器,迭代生成器这个函数可以进行foreach循环,每次都产生一个值。

PHP5.5之前是通过定义类实现Iterator接口的方式来构造迭代器,通过yield构造迭代器将更加提升性能节省系统开销

这种方法的优点是显而易见的.它可以让你在处理大数据集合的时候不用一次性的加载到内存中,甚至你可以处理无限大的数据流。

如上面例子所示,这个迭代器的功能是生成从1到1000000的数字,循环输出,那么使用以往的方式是生成好这1到1000000的数字到数组中,将会十分占用内存,因为是事先就要生成好所有结果,而不是用的时候按需生成,也就是说调用xrange这个迭代器的时候,里面的函数还没有真正的运行,直到你每一次的迭代。

再看看PHP官网的例子:

<?php
function xrange($start, $limit, $step = 1) {
  for ($i = $start; $i <= $limit; $i += $step) {
    yield $i;
  }
}
echo 'Single digit odd numbers: ';
/*
 * Note that an array is never created or returned,
 * which saves memory.
 */
foreach (xrange(1, 9, 2) as $number) {
  echo "$number ";
}
echo "\n";
?>

这里的xrange是一个迭代,功能和range是一样的,如果使用range函数的话,那么函数内部实现会储存每个迭代的中间过程,即每个中间变量都有 个内存空间,那么首先程序使用的内存空间就大了,而且分配内存,回收内存都会导致程序的运行时间加长。但是如果使用上yield实现的xrange函数的 话,里面所有的中间变量都只使用一个内存$i,这样节省的时间和空间都会变小。

那么为什么yield会有这样的效果呢?联想到lua中的yield,这里就算是协程的概念了。在lua语言中,当程序运行到yield的时候,使用协程 将上下文环境记录住,然后将程序操作权归还到主函数,当主函数调用resume的时候,会重新唤起协程,读取yield记录的上下文。这样形成了程序语言 级别的多协程操作。php 5.5这里的yield也是同样的道理,当程序运行到yield的时候,当前程序就唤起协程记录上下文,然后主函数继续操作,只是php中没有使用如 resume一样的关键字,而是“在使用的时候唤起”协程。比如上例中的foreach迭代器就能唤起yield。所以上面的这个例子就能理解了。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP入门速成(2)
Oct 09 PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
php strrpos()与strripos()函数
Aug 31 PHP
php 发送带附件邮件示例
Jan 23 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
May 27 PHP
php事件驱动化设计详解
Nov 10 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 PHP
PHP PDOStatement::nextRowset讲解
Feb 01 PHP
Laravel事件监听器用法实例分析
Mar 12 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 #PHP
PHP 中提示undefined index如何解决(多种方法)
Mar 16 #PHP
Laravel中Trait的用法实例详解
Mar 16 #PHP
Laravel中注册Facades的步骤详解
Mar 16 #PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 #PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 #PHP
PHP 二维数组和三维数组的过滤
Mar 16 #PHP
You might like
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
php页面防重复提交方法总结
2013/11/25 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php 发送带附件邮件示例
2014/01/23 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
javascript 写类方式之八
2009/07/05 Javascript
JS input 数字验证代码
2009/07/30 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
客服专员岗位职责范本
2013/11/29 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
大学生村官考核材料
2014/05/23 职场文书
应届生求职自荐信
2014/07/04 职场文书
四风查摆剖析材料
2014/10/10 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server
Redis过期数据是否会被立马删除
2022/07/23 Redis