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
PHP setcookie() cannot modify header information 的解决方法
Jan 09 PHP
PHP 函数学习简单小结
Jul 08 PHP
一个简单php扩展介绍与开发教程
Aug 19 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
php常用字符串比较函数实例汇总
Nov 24 PHP
CodeIgniter中使用Smarty3基本配置
Jun 29 PHP
PHP内核探索之解释器的执行过程
Dec 22 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
Mar 25 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
自制PHP框架之路由与控制器
May 07 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
PHP 输出简单动态WAP页面
2009/06/09 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
基于php编程规范(详解)
2017/08/17 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
js调用css属性写法
2013/09/21 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
React中的refs的使用教程
2018/02/13 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
JavaScript中如何调用Java方法
2020/09/16 Javascript
浅谈python多线程和队列管理shell程序
2015/08/04 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
Python字符串的常见操作实例小结
2019/04/08 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
Python 操作 MySQL数据库
2020/09/18 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
两则小学生的自我评价分享
2013/11/14 职场文书
初三政治教学反思
2014/01/30 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
地震捐款简报
2015/07/21 职场文书
军训后的感想
2015/08/07 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
八年级作文之友谊
2019/12/02 职场文书