返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php生成器详细讲解
  • 593
分享到

php生成器详细讲解

php生成器php生成器概念php生成器优点 2022-11-13 19:11:11 593人浏览 安东尼
摘要

目录一、生成器的概念二、生成器的优点三、生成器语法四、生成器的简单实例五、生成器简单实际应用一、生成器的概念 生成器提供了一种更容易的方法来实现简单的对象迭代,生成器允许你在 for

一、生成器的概念

生成器提供了一种更容易的方法来实现简单的对象迭代,生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。

二、生成器的优点

1、生成器会对PHP应用的性能有非常大的影响

2、php代码运行时节省大量的内存

3、比较适合计算大量的数据

三、生成器语法

生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。

四、生成器的简单实例

我们都知道php中有一个range函数,他的作用是创建一个包含指定范围的元素的数组,他的基本语法为range(low,high,step),表示包含从 low 到 high (包含 low 和 high)之间的整数或字符。如果 high 比 low 小,则返回反序的数组,step表示步长默认步长为1

例如:

range(0,10)

输出结果为:

Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 )

但是如果我们想要获取1-10000000之间所有的数组的话,调用range(0,10000000)时将导致占用内存耗尽

这时候我们就可以使用php的生成器来实现

1)编写一个生成器函数

public function rangeText($start, $limit, $step = 1)
{
    if ($start < $limit) {
        if ($step <= 0) {
            throw new InvalidConfigException('步长至少大于0');
        }
        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    } else {
        if ($step >= 0) {
            throw new InvalidConfigException('步长至少大于0');
        }
        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}

2)调用生成器函数

foreach ($this->rangeText(0,10000000) as $number) {
    echo $number .'<br />';
}

调用生成函数之后我们就可以将0-10000000之间的所有数打印出来

五、生成器简单实际应用

PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如10个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。那么这里生成器就可以派上用场

例:使用生成器读取txt文件

1)编写一个读取txt文件的生成器函数

public function readTest($txt)
{
    //打开文件
    $handle = fopen($txt, 'rb');
    //检测是否已到达文件末尾
    while (feof($handle)===false) {
        //使用生成器逐行读取文件数据
        yield   fgets($handle);
    }
    //关闭打开的文件
    fclose($handle);
}

2)调用读取txt文件的生成器函数

foreach ($this->readTest('test.txt') as $key=>$value) {
    echo $value.'<br />';
}

这时候我们就可以在浏览器看到txt文件中内容了

到此这篇关于php生成器详细讲解的文章就介绍到这了,更多相关php生成器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: php生成器详细讲解

本文链接: https://lsjlt.com/news/170625.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php生成器详细讲解
    目录一、生成器的概念二、生成器的优点三、生成器语法四、生成器的简单实例五、生成器简单实际应用一、生成器的概念 生成器提供了一种更容易的方法来实现简单的对象迭代,生成器允许你在 for...
    99+
    2022-11-13
    php生成器 php生成器概念 php生成器优点
  • Go设计模式之生成器模式详细讲解
    目录生成器模式概念示例生成器模式 生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。 与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的...
    99+
    2023-01-11
    Go设计模式 Go生成器模式
  • Java超详细讲解如何生成随机整数
    目录1. java.util.Random2. 数学.随机3. Java 8 Random.ints1. java.util.Random 这Random().nextInt(int...
    99+
    2024-04-02
  • PHP图表生成函数详细讲解:gd库、imagepng、imagestring等函数的图表生成指南
    PHP图表生成函数详细讲解:gd库、imagepng、imagestring等函数的图表生成指南图表生成在数据可视化中扮演着重要的角色,能够更直观地呈现数据变化趋势和关系。PHP作为一种流行的服务器端脚本语言,提供了一系列功能强大的图表生成...
    99+
    2023-11-18
    GD库 PHP图表生成函数 imagepng imagestring
  • Vue.js的生命周期详细讲解
    本篇内容主要讲解“Vue.js的生命周期详细讲解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue.js的生命周期详细讲解”吧!用Vue框架,熟悉它的生命周期...
    99+
    2024-04-02
  • Flutter生命周期超详细讲解
    目录一、组件生命周期1、StatelessWidget2、StatefulWidget2.1、初始化阶段2.2、状态变化阶段2.3、销毁阶段二、App生命周期一、组件生命周期 flu...
    99+
    2023-01-29
    Flutter生命周期研究 Flutter生命周期方法
  • Spring集成Mybatis过程详细讲解
    目录为啥学习集成Mybatis ORM框架实现步骤为啥学习集成Mybatis ORM框架 虽然Spring中提供了JDBCTemplate模块,已经很大程度了解决了JDBC代码的复杂...
    99+
    2023-03-19
    Spring集成Mybatis原理 Spring集成Mybatis配置
  • PHP 生成器的使用详解
    目录什么是生成器? 生成器有什么用? 生成器的应用 返回空值以及中断 返回键值对形式 外部传递数据 yield from 语法 小惊喜 生成器可以用count获取数量吗? 使用生产器...
    99+
    2024-04-02
  • PHP 接入shopify SDK 详细讲解
    前言: 有关 shopify 的实操例子太少了 为了给后面的人行以方便,也为了我下次不那么麻烦。我打算记录一下我的代码以及操作流程 首先既然是有关shopify的操作,你必须有一个shopify账号.(创建流程就不在这里进行描述) ...
    99+
    2023-09-04
    php 经验分享 其他
  • PHP基础知识详细讲解
    目录一、简介二、php基本语法三、变量和作用域四、常量五、数据类型六、运算符七、流程控制八、超全局变量一、简介 基础知识: 需要一定的html和css的语法知识 基本概念: PHP(...
    99+
    2022-12-03
    PHP基础知识 PHP基础语法
  • 【OAuth2】详细讲解
    文章目录                         一、Oauth2是什么?                         二、Oauth2的四种角色?                         三、Oauth2的...
    99+
    2023-09-20
    大数据 java spring boot web app
  • springmvc详细讲解
    一、SpringMVC 1.1 引言 java开源框架,Spring Framework的一个独立模块。 MVC框架,在项目中开辟MVC层次架构 对控制器中的功能 包装 简化 扩展践行工厂...
    99+
    2023-10-21
    servlet java spring mvc
  • Vue组件与生命周期详细讲解
    目录写在前面生命周期图解总结写在前面 Vue.js的核心就是以简洁的模板语法将数据渲染进Dom系统。vue实例在渲染成html的时候往往要经过以下的步骤: 读取数据和方法,设置数据绑...
    99+
    2022-11-13
    Vue组件 Vue生命周期
  • php超详细讲解命名管道
    目录进程间为什么要通信进程如何实现通信常见进程通信方式管道概念命名管道实现posix_mkfifo函数无血缘进程间通信进程间为什么要通信 进程间通信的目的: 数据传输:一个 进程需要...
    99+
    2024-04-02
  • SpringBoot超详细讲解多数据源集成
    目录一、多数据源使用场景与弊端1.场景2.弊端二、使用步骤1.引入库2.多数据源配置文件3.多数据源配置类4.使用总结一、多数据源使用场景与弊端 1.场景 业务系统跨数据库数据转存(...
    99+
    2024-04-02
  • Spring Cloud详细讲解zuul集成Eureka流程
    目录zuul集成EurekaZuul路由配置1. 指定具体服务路由2. 路由前缀Zuul过滤器过滤器类型使用过滤器zuul集成Eureka 通过刚才的示例,我们已经可以简单地使用 Z...
    99+
    2024-04-02
  • Java线程生命周期图文详细讲解
    线程的状态 New 表示线程已创建,没启动的状态此时已经做了一些准备工作,还没有执行run方法中代码 Runnable 调用start方法之后的状态,表示可运行状态(不一定正在运行...
    99+
    2023-01-28
    Java线程生命周期 Java生命周期
  • GoLangunsafe包详细讲解
    目录1.前言2.指针类型转换3.指针运算4.获取大小和偏移5.关于string1.前言 开发中,[]byte类型和string类型需要互相转换的场景并不少见,直接的想法是像下面这样进...
    99+
    2024-04-02
  • C++BoostAtomic详细讲解
    目录一、说明二、示例和代码一、说明 Boost.Atomic 提供类 boost::atomic,可用于创建原子变量。它们被称为原子变量,因为所有访问都是原子的。 Boost.Ato...
    99+
    2022-11-21
    C++ Boost Atomic C++ Atomic
  • AndroidSwipeRefreshLayout超详细讲解
    目录1. 控件说明2. API介绍3. 使用方法3.1 布局文件3.2 界面代码4. 注意事项1. 控件说明 SwipeRefreshLayout是google官方推荐使用的下拉刷新...
    99+
    2022-11-13
    Android SwipeRefreshLayout Android SwipeRefreshLayout控件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作