博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator
阅读量:7103 次
发布时间:2019-06-28

本文共 3745 字,大约阅读时间需要 12 分钟。

轻量级“集合”迭代器-Generator

Generator是PHP 5.5加入的新语言特性。但是,它似乎并没有被很多PHP开发者广泛采用。因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下Generator究竟为我们解决什么问题。


一千万个整数的数组

如果我们要“创建一个指定元素个数的数组”,怎么做呢?我们可能会不加思索的写下下面的代码:

function makeRange($range) { $data = []; for ($i = 0; $i < $range; $i++) { $data[] = $i; } return $data; }

然后,在我们的开发环境里,分别创建1万个,10万个,100万个元素的数组,一切看起来都如我们想象。

makeRange(10000);makeRange(100000);makeRange(1000000);

但是,当我们创建一个包涵1千万个整数的数组时,情况就不一样了,系统没有那么多内存分配给我们:

makeRange(10000000);

在资源有限的情况下,解决大文件或大批量数据的处理问题,就是PHP generator的一个典型应用。

把PHP Generator请出来帮忙

定义PHP generator很简单,看上去就像定义一个函数一样:

function makeRangeByGenerator($range) { for ($i = 0; $i < $range; $i++) { yield $i; } }

只是,makeRangeByGenerator没有返回值,也没有把整个数组创建在内存里,而只是通过关键字yield,标记了每次循环应该生成的值。接下来,我们可以像访问一个普通集合一样使用generator:

foreach ($makeRangeByGenerator(100) as $i) { echo $i.'
'; }

现在重新执行我们的PHP文件,就不会再报错了。并且,我们可以在页面上,看到generator生成的值。这就是generator的典型应用场景,简单来说:Generator就是一个轻量级迭代器,它可以自动的记住每一次被调用时的状态,并返回给我们正确的值。

PHP 7做了哪些改进?

了解了generator的基本用法之后,我们就可以看一下PHP 7对它做了哪些改进了。

  • PHP 7允许我们给generator加入返回值,就像我们定义函数的返回值一样:

    function makeRangeByGenerator($range) {

    for ($i = 0; $i < $range; $i++) { yield $i; } return "Finish yielding";

    }

迭代完generator的所有元素时,我们就可以通过getReturn()方法,来读取generator的返回值:

$gen = makeRangeByGenerator(100);foreach ($gen as $i) { echo $i.'
'; } echo $gen->getReturn();

*“我们必须在所有迭代完generator所有值之后,才能读取generator的返回值,否则PHP会报错。”
——最佳实践*

  • PHP 7对generator的第二个改进就是允许嵌套。例如:

function outer() { yield "PHP 7 "; yield "is one of "; yield "the best "; yield from inner(); } function inner() { yield "programming languages in the world"; }

我们使用关键字from引入一个新的generator,当我们遍历outer generator时,我们就会发现,它自动生成了inner generator的值:

foreach(outer() as $str) {    echo $str; }

这就是关于PHP generator的全部内容。简单来说,generator就是一个轻量级的,可以记住自身状态的“集合”迭代器。如果你之前还不了解它,现在是时候考虑下它在哪些地方可以帮助到你了。

了解更多优质IT技术,拓展阅读视野,欢迎大家访问我们的合作伙伴Segmentfault

 

轻量级“集合”迭代器-Generator

Generator是PHP 5.5加入的新语言特性。但是,它似乎并没有被很多PHP开发者广泛采用。因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下Generator究竟为我们解决什么问题。


一千万个整数的数组

如果我们要“创建一个指定元素个数的数组”,怎么做呢?我们可能会不加思索的写下下面的代码:

function makeRange($range) { $data = []; for ($i = 0; $i < $range; $i++) { $data[] = $i; } return $data; }

然后,在我们的开发环境里,分别创建1万个,10万个,100万个元素的数组,一切看起来都如我们想象。

makeRange(10000);makeRange(100000);makeRange(1000000);

但是,当我们创建一个包涵1千万个整数的数组时,情况就不一样了,系统没有那么多内存分配给我们:

makeRange(10000000);

在资源有限的情况下,解决大文件或大批量数据的处理问题,就是PHP generator的一个典型应用。

把PHP Generator请出来帮忙

定义PHP generator很简单,看上去就像定义一个函数一样:

function makeRangeByGenerator($range) { for ($i = 0; $i < $range; $i++) { yield $i; } }

只是,makeRangeByGenerator没有返回值,也没有把整个数组创建在内存里,而只是通过关键字yield,标记了每次循环应该生成的值。接下来,我们可以像访问一个普通集合一样使用generator:

foreach ($makeRangeByGenerator(100) as $i) { echo $i.'
'; }

现在重新执行我们的PHP文件,就不会再报错了。并且,我们可以在页面上,看到generator生成的值。这就是generator的典型应用场景,简单来说:Generator就是一个轻量级迭代器,它可以自动的记住每一次被调用时的状态,并返回给我们正确的值。

PHP 7做了哪些改进?

了解了generator的基本用法之后,我们就可以看一下PHP 7对它做了哪些改进了。

  • PHP 7允许我们给generator加入返回值,就像我们定义函数的返回值一样:

    function makeRangeByGenerator($range) {

    for ($i = 0; $i < $range; $i++) { yield $i; } return "Finish yielding";

    }

迭代完generator的所有元素时,我们就可以通过getReturn()方法,来读取generator的返回值:

$gen = makeRangeByGenerator(100);foreach ($gen as $i) { echo $i.'
'; } echo $gen->getReturn();

*“我们必须在所有迭代完generator所有值之后,才能读取generator的返回值,否则PHP会报错。”
——最佳实践*

  • PHP 7对generator的第二个改进就是允许嵌套。例如:

function outer() { yield "PHP 7 "; yield "is one of "; yield "the best "; yield from inner(); } function inner() { yield "programming languages in the world"; }

我们使用关键字from引入一个新的generator,当我们遍历outer generator时,我们就会发现,它自动生成了inner generator的值:

foreach(outer() as $str) {    echo $str; }

这就是关于PHP generator的全部内容。简单来说,generator就是一个轻量级的,可以记住自身状态的“集合”迭代器。如果你之前还不了解它,现在是时候考虑下它在哪些地方可以帮助到你了。

了解更多优质IT技术,拓展阅读视野,欢迎大家访问我们的合作伙伴Segmentfault

 

 
 
原文:
https://segmentfault.com/a/1190000004307491

转载地址:http://kochl.baihongyu.com/

你可能感兴趣的文章
如何发现品牌潜客?目标人群优选算法模型及实践解析
查看>>
前端进阶系列(五):flex布局
查看>>
【静态页面架构】CSS之其它元素
查看>>
登录界面引入引入css问题
查看>>
探索 PM2 Cluster 模式下 Log4js 日志丢失
查看>>
微信小程序开发,如何优雅地兼容
查看>>
leetcode-140- Word Break II
查看>>
第四天,背景边框列表链接和更复杂的选择器-IFE
查看>>
【分享】VMware&ESXI详细黑群晖教程 DS36156
查看>>
JavaScript学习笔记之数组(二)
查看>>
判断两个对象的值是否相等
查看>>
Vue 教程第三篇—— 绑定 class
查看>>
【three.js学习笔记】渲染器
查看>>
CentOS7.3中安装MySQL5.6
查看>>
mysql的两种存储引擎
查看>>
openresty下lua的function定义及调用
查看>>
TypeScript学习笔记—变量的声明
查看>>
Python基础之文本格式化
查看>>
理解javascript类数组
查看>>
ClojureScript 1.10.x 新技能 cljs.main 快速开启
查看>>