广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何在PHP中使用生成器
  • 726
分享到

如何在PHP中使用生成器

2023-06-14 22:06:09 726人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关如何在PHP中使用生成器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。php开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampSer

这期内容当中小编将会给大家带来有关如何在PHP中使用生成器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

php开发环境搭建工具有哪些

一、phpStudy,是一个新手入门最常用的开发环境。二、WampServer,WampServer也同样的也是和phpStudy一样操作简单对小白比较友好。三、XAMPP,XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包;四、MAMP,MAMP分为两种MAMP和MAMP Pro for Mac。五、宝塔面板,宝塔面板是一款服务器管理软件,支持windowslinux系统。六、UPUPW,UPUPW是目前Windows平台下最具特色的WEB服务器PHP套件。

什么是生成器?

生成器是一个用于迭代的迭代器。它提供了一种更容易的方式来实现简单的对象迭代,相比较定义类实现Iterator接口的方式,性能开销和复杂性大大降低。

说了半天不如直接看看代码更直观。

function test1(){    for ($i = 0; $i < 3; $i++) {        yield $i + 1;    }    yield 1000;    yield 1001;}foreach (test1() as $t) {    echo $t, PHP_EOL;}// 1// 2// 3// 1000// 1001

就是这么简单的一段代码。首先,生成器必须在方法中并使用 yield 关键字;其次,每一个 yield 可以看作是一次 return ;最后,外部循环时,一次循环取一个 yield 的返回值。在这个例子,循环三次返回了1、2、3这三个数字。然后在循环外部又写了两行 yield 分别输出了1000和1001。因此,外部的 foreach 一共循环输出了五次。

很神奇吧,明明是一个方法,为什么能够循环它而且还是很奇怪的一种返回循环体的格式。我们直接打印这个 test() 方法看看打印的是什么:

// 是一个生成器对象var_dump(test1());// Generator Object// (// )

当使用了 yield 进行内容返回后,返回的是一个 Generator 对象。这个对象就叫作生成器对象,它不能直接被 new 实例化,只能通过生成器函数这种方式返回。这个类包含 current() 、 key() 等方法,而且最主要的这个类实现了 Iterator 接口,所以,它就是一个特殊的迭代器类。

Generator implements Iterator {        public current ( void ) : mixed    public key ( void ) : mixed    public next ( void ) : void    public rewind ( void ) : void    public send ( mixed $value ) : mixed    public throw ( Exception $exception ) : void    public valid ( void ) : bool    public __wakeup ( void ) : void}

生成器有什么用?

搞了半天不就是个迭代器嘛?搞这么麻烦干嘛,直接用迭代器或者在方法中直接返回一个数组不就好了吗?没错,正常情况下真的没有这么麻烦,但是如果是在数据量特别大的情况下,这个生成器就能发挥它的强大威力了。生成器最最强大的部分就在于,它不需要一个数组或者任何的数据结构来保存这一系列数据。每次迭代都是代码执行到 yield 时动态返回的。因此,生成器能够极大的节约内存。

// 内存占用测试$start_time = microtime(true);function test2($clear = false){    $arr = [];    if($clear){        $arr = null;        return;    }    for ($i = 0; $i < 1000000; $i++) {        $arr[] = $i + 1;    }    return $arr;}$array = test2();foreach ($array as $val) {}$end_time = microtime(true);echo "time: ", bcsub($end_time, $start_time, 4), PHP_EOL;echo "memory (byte): ", memory_get_usage(true), PHP_EOL;// time: 0.0513// memory (byte): 35655680$start_time = microtime(true);function test3(){    for ($i = 0; $i < 1000000; $i++) {        yield $i + 1;    }}$array = test3();foreach ($array as $val) {}$end_time = microtime(true);echo "time: ", bcsub($end_time, $start_time, 4), PHP_EOL;echo "memory (byte): ", memory_get_usage(true), PHP_EOL;// time: 0.0517// memory (byte): 2097152

上述代码只是简单的进行 1000000 个循环后获取结果,不过也可以直观地看出。使用生成器的版本仅仅消耗了 2M 的内存,而未使用生成器的版本则消耗了 35M 的内存,直接已经10多倍的差距了,而且越大的量差距超明显。因此,有大神将生成器说成是PHP中最被低估了的一个特性。

生成器的应用

接下来我们来看看生成器的一些基本的应用方式。

返回空值以及中断

生成器当然也可以返回空值,直接 yield; 不带任何值就可以返回一个空值了。而在方法中直接使用 return; 也可以用来中断生成器的继续执行。下面的代码我们在 \i = 4; 的时候返回的是个空值,也就是不会输出 5 (因为我们返回的是i=4;的时候返回的是个空值,也就是不会输出5(因为我们返回的是i + 1 )。然后在 $i == 7 的时候使用 return; 中断生成器的继续执行,也就是循环最多只会输出到 7 就结束了。

// 返回空值以及中断function test4(){    for ($i = 0; $i < 10; $i++) {        if ($i == 4) {            yield; // 返回null值        }        if ($i == 7) {            return; // 中断生成器执行        }        yield $i + 1;    }}foreach (test4() as $t) {    echo $t, PHP_EOL;}// 1// 2// 3// 4// 5// 6// 7

返回键值对形式

不要惊讶,生成器真的是可以返回键值对形式的可遍历对象供 foreach 使用的,而且语法非常好记: yield key => value; 是不是和数组项的定义形式一模一样,非常直观好理解。

function test5(){    for ($i = 0; $i < 10; $i++) {        yield 'key.' . $i => $i + 1;    }}foreach (test5() as $k=>$t) {    echo $k . ':' . $t, PHP_EOL;}// key.0:1// key.1:2// key.2:3// key.3:4// key.4:5// key.5:6// key.6:7// key.7:8// key.8:9// key.9:10

外部传递数据

我们可以通过 Generator::send 方法来向生成器中传入一个值。传入的这个值将会被当做生成器当前 yield 的返回值。然后我们根据这个值可以做一些判断,比如根据外部条件中断生成器的执行。

function test6(){    for ($i = 0; $i < 10; $i++) {        // 正常获取循环值,当外部send过来值后,yield获取到的就是外部传来的值了        $data = (yield $i + 1);        if($data == 'stop'){            return;        }    }}$t6 = test6();foreach($t6 as $t){    if($t == 3){        $t6->send('stop');    }    echo $t, PHP_EOL;}// 1// 2// 3

上述代码理解起来可能比较绕,但是注意记住注释的那行话就行了(正常获取循环值,当外部send过来值后,yield获取到的就是外部传来的值了)。另外,变量获取 yield 的值,必须要用括号括起来。

yield from 语法

yield from 语法其实就是指的从另一个可迭代对象中一个一个的获取数据并形成生成器返回。直接看代码

function test7(){    yield from [1, 2, 3, 4];    yield from new ArrayIterator([5, 6]);    yield from test1();}foreach (test7() as $t) {    echo 'test7:', $t, PHP_EOL;}// test7:1// test7:2// test7:3// test7:4// test7:5// test7:6// test7:1// test7:2// test7:3// test7:1000

在 test7() 方法中,我们使用 yield from 分别从普通数组、迭代器对象、另一个生成器中获取数据并做为当前生成器的内容进行返回。

小惊喜

生成器可以用count获取数量吗?

抱歉,生成器是不能用count来获取它的数量的。

$c = count(test1()); // Warning: count(): Parameter must be an array or an object that implements Countable// echo $c, PHP_EOL;

使用 count 来获取生成器的数量将直接报 Warning 警告。直接输出将会一直显示是 1 ,因为 count 的特性(强制转换成数组都会显示 1 )。

使用生产器来获取斐波那契数列

// 利用生成器生成斐波那契数列function fibonacci($item){    $a = 0;    $b = 1;    for ($i = 0; $i < $item; $i++) {        yield $a;        $a = $b - $a;        $b = $a + $b;    }}$fibo = fibonacci(10);foreach ($fibo as $value) {    echo "$value\n";}

上述就是小编为大家分享的如何在PHP中使用生成器了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网PHP编程频道。

--结束END--

本文标题: 如何在PHP中使用生成器

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在PHP中使用生成器
    这期内容当中小编将会给大家带来有关如何在PHP中使用生成器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampSer...
    99+
    2023-06-14
  • 如何在PHP中使用生成器函数
    在PHP中,生成器函数是一种强大的工具,可以帮助您高效地创建和处理大量数据。这种函数允许您生成一个序列,但是只在需要时才会计算下一个值,可以大大节省系统资源和执行时间。在这篇文章中,我们将介绍如何在PHP中使用生成器函数。什么是生成器函数?...
    99+
    2023-05-19
    PHP编程 生成器函数 迭代器对象
  • 如何在python中使用密码生成器
    本篇文章为大家展示了如何在python中使用密码生成器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,...
    99+
    2023-06-14
  • 如何在python中调用生成器
    本篇文章为大家展示了如何在python中调用生成器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pillo...
    99+
    2023-06-14
  • 如何在PHP中生成二维码?
    二维码是一种二维条码,可以将信息编码成黑白图案,通常用于快速扫描和识别信息。在现代社会中,二维码已经成为了人们生活中不可或缺的一部分。在这篇文章中,我们将探讨如何在PHP中生成二维码。 为了生成二维码,我们需要用到一个PHP库——PHP ...
    99+
    2023-10-17
    npm api 二维码
  • 如何在PHP中生成随机数
    在PHP中生成随机数可以使用内置的rand()函数或者使用random_int()函数,具体如下:1. 使用rand()函数:```...
    99+
    2023-08-15
    PHP
  • 如何在php中生成唯一ID
    这篇文章将为大家详细讲解有关如何在php中生成唯一ID,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Ja...
    99+
    2023-06-14
  • 如何在 PHP 应用中集成二维码生成 API?
    随着移动互联网的发展,二维码已经成为我们生活中不可或缺的一部分。二维码具有快速、简单、便捷的特点,为我们的生活带来了极大的便利。在开发应用时,为了更好地体验和增加用户体验,我们需要将二维码集成到我们的应用中。 在 PHP 应用中,我们可以...
    99+
    2023-08-27
    二维码 npm api
  • PHP 中如何使用二维码生成 API?
    二维码已经成为现代生活中不可或缺的一部分,而在 PHP 中使用二维码生成 API 可以让我们轻松地生成二维码。本文将介绍 PHP 中如何使用二维码生成 API,并提供一些示例代码。 安装和引入 QRCode 类 首先,我们需要安装和引...
    99+
    2023-08-27
    二维码 npm api
  • 如何在php中使用chr()函数随机生成字符串
    这篇文章给大家介绍如何在php中使用chr()函数随机生成字符串,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.主要利用了两个函数:chr()mt_rand()2.语法格式:mt_rand() 使用 Mersenne...
    99+
    2023-06-14
  • 如何在 PHP 中使用 NPM 安装的二维码生成 API?
    当今互联网时代,二维码已经成为了重要的信息传递方式之一。为了方便我们在 PHP 项目中生成二维码,我们可以使用 NPM 安装的二维码生成 API。在本文中,我们将介绍如何在 PHP 中使用 NPM 安装的二维码生成 API。 安装 Nod...
    99+
    2023-08-27
    二维码 npm api
  • 如何在Django中使用Pyecharts生成图表
    如何在Django中使用Pyecharts生成图表?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1 因为pyecharts是支持python的一种可视化,但是想要将其放入网页中...
    99+
    2023-06-15
  • 如何在Python中使用ECharts生成地图
    如何在Python中使用ECharts生成地图地图是一种直观展示地理信息的可视化方式,而Python作为一门强大的编程语言,提供了丰富的数据处理和可视化工具。其中ECharts是一款流行的数据可视化库,支持通过Python进行地图绘制和展示...
    99+
    2023-12-17
    Python echarts 地图
  • PHP中token如何生成
    这篇文章主要为大家展示了“PHP中token如何生成”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP中token如何生成”这篇文章吧。php token的生成接口特点汇总:因为是非开放性的,...
    99+
    2023-06-20
  • JavaScript生成器如何使用
    这篇文章主要讲解了“JavaScript生成器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript生成器...
    99+
    2022-10-19
  • python生成器如何使用
    这篇文章主要介绍“python生成器如何使用”,在日常操作中,相信很多人在python生成器如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python生成器如何使用”...
    99+
    2022-10-19
  • 怎么在php中使用rand生成随机数
    怎么在php中使用rand生成随机数?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流...
    99+
    2023-06-14
  • PHP 生成器的使用详解
    目录什么是生成器? 生成器有什么用? 生成器的应用 返回空值以及中断 返回键值对形式 外部传递数据 yield from 语法 小惊喜 生成器可以用count获取数量吗? 使用生产器...
    99+
    2022-11-12
  • 在 PHP 中如何生成带索引的 shell?
    Shell是一种命令行解释器,它为用户提供了一个与操作系统交互的界面。在Unix/Linux系统中,Shell是非常重要的一部分,因为它是操作系统与用户之间的交互界面。PHP提供了一些内置函数来执行Shell命令,同时也可以通过PHP来生...
    99+
    2023-08-21
    打包 索引 shell
  • python如何在函数内部使用生成器
    小编给大家分享一下python如何在函数内部使用生成器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在函数内部使用生成器在写Py...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作