生成器的核心是一个yield关键字,一个生成器函数看起来像一个普通的函数,不同的是。普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值。生成器函数被调用时,返回的是一个可以被遍历的对象。
yield和return有点类似,不过不同的是,return会返回值并且终止代码的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。

<?php
function get_one_to_three(){
for($i=1;$i<=3;$i++){
yield $i;
}
}
$generator=get_one_to_three();
var_dump($generator);
echo '<br/>';
var_dump($generator instanceof Iterator);
echo '<br/>';
foreach ($generator as $value){
  echo $value,'<br/>';
}
输出结果:
aaarticlea/png;base64,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" alt="" />
调用get_one_to_three()的时候,里面的代码并没有真正的执行,而是返回了一个生产期对象$generator=Generator Object(),$genetator instanceof Iterator说明Generator实现了Iterator接口,可以用foreach进行遍历,每次遍历都会隐式调用current()、next()、key()、valid()等方法。(Generator类中的方法)
<?php
Generator implements Iterator{
public mixed current(void)//返回当初产生的值
public mixed key(void)//返回当前产生的键
public void next(void)//生产器继续执行
public void rewind(void)//重置迭代器,如果迭代已经开始了,这里会抛出一个异常。
public mixed send(mixed $value)//向生成器中传入一个值,当前yield接收值,然后继续执行下一个yield
public void throw(Exception $exception)//向生成器中抛入一个异常
public bool valid(void)//检查迭代器是否被关闭,已被关闭返回FALSE,否则返回TRUE
public void __wakeup(void)//序列化回调
public mixed getReturn(void)//返回generator函数的返回值,PHP version 7+
}
处理大数据
​下面通过实现一个xrange函数来简单说明:
<?php
function xrange($start,$end,$step=1){
for($i=$start;$i<=$end;$i+=$step){
yield $i;
}
} foreach(xrange(1,10) as $num){
echo $num,'<br/>';
}
输出结果:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAADWCAYAAABxNspcAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPwSURBVHhe7ZxbkuowDETZYZaVpWQpLIVl5MYPwPGjRvZlSLenT5U/Bn44JVtIipnbPiGSYkFSLEiKhX6px7Yvt3W/xz8R6ZC67+vttt/8mkHqvr5EHtsyiVSCpC5CUg5JXYSkHJK6CEmxICkWJMWCpFiQFAtGqce+Lc/5RFwrbk1hkvKl0UkiDmGW7dDFY3z7+WHMsm+AVpJKQa7Wx6R8lHCTRbdUiBBuknB0SCVjZ+B07jBKPYUwE0OOSeq+OiHsFj7FIBWitDCEKGKWepVH+QI8Xx2JggdJsSApFiTFgqRYMEu9Wo64kMsmm9TRFJ4kYpOIKja4/eLIbJbONzChFPojUrNUaBTjmqOdz5gzUWBvwWGpEC1NaL+GQcql7+zDz3Gm8uEL9vxv/EwBIykWJMWCpFiQFAtDUs8hDGpb1S/lfz8VyqVppHwHvCxebA4pX50fFXuM1gRSybPfOaSykdgMUkWXSy9Vm0VwS1VuZBYLrwvuSBQJ82S/BEl9nzEpcCTFgqRYkBQLkmLBKNW4RwtaUtikwMuinL8uxfHrAYdNCvhJfI0OKY4k4bBJ5TwlqbNfhTBhwtySw1LI58wk9XiUn5w+Uk7gdHzimaK/RXa673cs5C/i8TMFjKRYkBQLkmJBUiz0ScW2/l1ZkN9LR7+6k2KTmnHw4qME/E81cgxS2L+VqmGQel/fObcfuNMls1SeJJATh12q+PSt16/HfKbK1h33rBmkYis/V6QO4vdUGq2QNOjnfu+EERZmieTokOJBUixIigVJsSApFn6Wqj3EThbiM6rhSIV+inyadCbUgfRPElOQo+QYkMKOkqNbCj1Kjk4p/Cg5+qSAL4SkdEmFH1niT2o7pDi2nsMuFSsLwOFRgVmKIes96UsUJEiKBUmxICkWJMWCXSofwADXSzap4nZzfFYFKmaSqrYcXpR4mjSlVPnMd5oRWTxHcSH3VSap0Euls4l4hwK0tTdItbYa7hb8Wap514/5xkvlYkiAOVIH5e2WGCXqlH4QkkXIfH4Bz//MUkxIigVJsSApFiTFgl0qG7ygNogOk1TZT8WGkXfw0qjGfeRYr3A3+6kgixgss1QRqWafdT2mM9Xup4ilHEHsvdY7eedbpXnWrmdcin5CW4A7SXKYpB7bevo+CucL96KIMVLvbOcX+KWr8TMFjKRYkBQLkmJBUiz0S/nqvF0ilS1KfOOLdEjFYYtfdam8JiwHNt/BJpW0Gc1bz9X+6ppqvnv7taRar19R0X9Myn/4SvV+xRb8damwdSX132j7OVpSva//Jh+TCttsspT+EkjeuyJKjg9KObIBzQVCjm4pBiTFgqRYmFBq3/8BAvkGUGcBBTkAAAAASUVORK5CYII=" alt="" />
上面这个xrange()函数提供了和PHP的内建函数range()一样的功能,但是不同的是range()函数返回的是一个包含值从1到10的数组,而xrange()函数返回的是依次输出的这些值得一个迭代器,而不会真正以数组形式返回。
这种方法的优点是显而易见的,它可以让你在处理大数据集合的时候不用一次性的加载到内存中,甚至你可以处理无限大的数据流。
处理大文件
​来优化下读取大文件,在PHP读取大文件的时候,经常会出现内存不足的情况,如果文件过大的话,没法一次读取完,采用yield来实现大文件的读取。
老式读取
function readLocalFile($fileName){
$handle=fopen($fileName,'r');
$lines=[];
while(!feof($handle)){
$lines[]=fgets($handle);
}
fclose($handle);
return $lines;
}
yield读取方式
function readYieldFile($fileName){
$handle=fopen($fileName,'r');
while(!feof($handle)){
yield fgets($handle);
}
fclose($handle);
}
为了便于测试,我们写一个读取内存的辅助函数
function formatBytes($bytes)
{
if ($bytes < 1024) {
return $bytes . 'b';
} elseif ($bytes) {
return round($bytes / 1024, 2) . 'kb';
}
return round($bytes / 1048576, 2) . 'mb';
}

测试

//第一种
var_dump(readLocalFile('./test.txt'));
echo '<br/>',formatBytes(memory_get_peak_usage()),'<br/>'; //第二种
$lines = readYieldFile('./test.txt');
foreach ($lines as $row) {
echo $row,'<br/>';
}
echo formatBytes(memory_get_peak_usage());

输出结果:

aaarticlea/png;base64,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" alt="" />
总结
​使用老式读取,返回的是一个包含每行数据的数组,而yield方式则返回的是一个迭代器,而不会以真正的数组返回。
这种方法的优点是显而易见的,它可以让你在处理大数据集合的时候不用一次性的加载到内存中,甚至你可以处理无限大的数据流。

PHP学习之迭代生成器的更多相关文章

  1. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  2. PHP迭代生成器---yield

    1.迭代生成器 生成器的核心是一个yield关键字,一个生成器函数看起来像一个普通的函数,不同的是:普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值.生成器函数被调用时,返回的是一个 ...

  3. python3使用迭代生成器yield减少内存占用

    技术背景 在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中.其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会 ...

  4. Python学习笔记之生成器、迭代器和装饰器

    这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...

  5. python-切片 迭代 生成器

    1 切片操作 >>> L ['aaa', 'bbb', 'ccc', 'ddd'] >>> L[0:3] ['aaa', 'bbb', 'ccc'] >> ...

  6. javascript学习笔记--迭代函数

    概要 这里的迭代函数指的是对数组对象的操作方法,js数组共有五个迭代函数:every.fifter.forEach.map.some. 1.every every方法,返回值为Boolean类型,tr ...

  7. Python学习day17 迭代器&生成器

    迭代器&生成器 1. 迭代器 1.1 迭代器 迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代" 迭代器:帮助对某种对象 ...

  8. 廖雪峰老师博客学习《通过生成器generator生成列表式杨辉三角》

    说明:这是我接触生成器概念后,自己对它的理解,可能比较表面,没深入理解,也可能有错误.后续校正错误认知,将有关generator作为一个tag了! 希望以后能活用. 先贴出自己写的triangles( ...

  9. python学习日记(生成器函数进阶)

    迭代器和生成器的概念 迭代器 对于list.string.tuple.dict等这些容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数.iter()是python内 ...

随机推荐

  1. openpyxl模块(excel操作)

    openpyxl模块介绍 openpyxl模块是一个读写Excel 2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读 ...

  2. redhat7.4安装gitlab

    1.参考官方安装指南 https://about.gitlab.com/install/#centos-7 2.遇到的问题 2.1.启动postfix出错 错误内容 Job for postfix.s ...

  3. springmvc返回json对象

    1.引入jackson的依赖 <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -- ...

  4. Flutter安装

    下载右边的安装包以获取最新版本 stable 的 Flutter SDK 将压缩包解压,然后把其中的 flutter 目录整个放在你预想的 Flutter SDK 安装目录中(比如 C:\src\fl ...

  5. 【Robot Framework 】项目实战汇总

    写在前面 RF自动化的文章记录基本完成,建一个汇总目录,方便查看. [Robot Framework 项目实战]汇总 ∮[RF 项目实战 00]环境搭建 ∮[RF 项目实战 01]使用 Request ...

  6. PyTricks-Differebt ways to test multiple flags at once in

    x, y, z = 0, 1, 0 if x == 1 or y == 1 or z == 1: print('passed') if 1 in (x, y, z): print('passed') ...

  7. MyBatis入门使用

    MyBatis入门使用 MyBatis简介 MyBatis是支持普通SQL查询.存储过程和高级映射的持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBati ...

  8. Linux设备驱动程序 之 中断和锁

    中断和锁 1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq ...

  9. win10设置开机开启数字锁定

    windows10开机小键盘默认关闭,网上查询修改InitialKeyboardIndicators键值为2,或者80000002,经过实际测试,均无效,键值8000000002有效,是中间8个0,开 ...

  10. [转]SQL 读取表结构

    1.Sql SELECT column_name as FName,data_type as FType,CHARACTER_MAXIMUM_LENGTH as FLen from informati ...