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 相关文章推荐
论坛头像随机变换代码
Oct 09 PHP
mysq GBKl乱码
Nov 28 PHP
PHP MemCached高级缓存配置图文教程
Aug 05 PHP
php在服务器执行exec命令失败的解决方法
Mar 03 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
PHP连接局域网MYSQL数据库的简单实例
Aug 26 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
Sep 21 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
PHP7新功能总结
Apr 14 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 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类
2006/10/09 PHP
PHP SQLite类
2009/05/07 PHP
php的sso单点登录实现方法
2015/01/08 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
JQuery 写的个性导航菜单
2009/12/24 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
JavaScript mixin实现多继承的方法详解
2017/03/30 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
Python实现字典的key和values的交换
2015/08/04 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
Pycharm Git 设置方法
2020/09/15 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
J2EE模式面试题
2016/10/11 面试题
生产部经理岗位职责
2013/12/16 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
投资入股合作协议书
2014/10/28 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
教师节老师寄语
2015/05/28 职场文书
什么是SOLID
2022/03/24 Javascript
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL