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实现paypal整合方法
Nov 28 PHP
PHP下判断网址是否有效的代码
Oct 08 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
Jan 26 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
Yii框架中memcache用法实例
Dec 03 PHP
Nginx下配置codeigniter框架方法
Apr 07 PHP
php判断用户是否手机访问代码
Jun 08 PHP
PHP中异常处理的一些方法整理
Jul 03 PHP
php图片添加水印例子
Jul 20 PHP
PHP的mysqli_rollback()函数讲解
Jan 23 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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中经典方法实现判断多维数组是否为空
2011/10/23 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
PHP实现的简单缓存类
2015/07/29 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
js 格式化时间日期函数小结
2010/03/20 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
python获取指定时间差的时间实例详解
2017/04/11 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
公司年会抽奖活动主持词
2014/03/31 职场文书
解除劳动合同协议书
2014/04/14 职场文书
暑假家长评语大全
2014/04/17 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
Anaconda配置各版本Pytorch的实现
2021/08/07 Python