首页 » SEO优化 » php生成器技巧_PHP 中生成器的创建和运用

php生成器技巧_PHP 中生成器的创建和运用

访客 2024-10-23 0

扫一扫用手机浏览

文章目录 [+]

1、概述

天生器是 PHP 5.5 引入的新特性,但是目测很少人用到它,实在这是个非常有用的功能。

php生成器技巧_PHP 中生成器的创建和运用

天生器和迭代器有点类似,但是与标准的PHP迭代器不同,PHP天生器不哀求类实现Iterator接口,从而减轻了类的开销和包袱。
天生器会根据需求每次打算并产出须要迭代的值,这对运用的性能有很大的影响:试想如果标准的PHP迭代器常常在内存中实行迭代操作,这要预先打算出数据集,性能低下;如果要利用特定办法打算大量数据,如操作Excel表数据,对性能影响愈甚。
此时我们可以利用天生器,即时打算并产出后续值,不占用宝贵的内存空间。

php生成器技巧_PHP 中生成器的创建和运用
(图片来自网络侵删)

2、创建天生器

天生器的创建办法很大略,由于天生器便是PHP函数,只不过要在函数中一次或多次利用yield关键字。
与普通的PHP函数不同的是,天生器从不返回值,只产出值。
下面是一个大略的天生器实现:

function getLaravelAcademy() { yield 'http://LaravelAcademy.org'; yield 'Laravel学院'; yield 'Laravel Academy';}

很大略吧!
调用此生成器函数时,PHP会返回一个属于Generator类的工具,这个工具可以利用foreach函数迭代,每次迭代,PHP会哀求Generator实例打算并供应下一个要迭代的值。
天生器的优雅表示在每次产出一个值之后,天生器的内部状态都会停顿;向天生器要求下一个值时,内部状态又会规复。
天生器内部的状态会一贯在停顿和规复之间切换,直到抵达函数定义体的末端或碰着空的return语句为止。
我们可以利用下面的代码调用并迭代上面定义的天生器:

foreach(getLaravelAcademy() as $yieldedValue) { echo $yieldedValue, PHP_EOL;}

上面代码输出如下:

http://LaravelAcademy.orgLaravel学院Laravel Academy

3、利用天生器

下面我们实现一个大略的函数用于天生一个范围内的数值,以此解释天生器是如何节省内存的。
首先我们通过迭代器来实现:

function makeRange($length) { $dataSet = []; for ($i=0; $i<$length; $i++) { $dataSet[] = $i; } return $dataSet;}$customRange = makeRange(1000000);foreach ($customRange as $i) { echo $i . PHP_EOL;}

此时实行会报错,提示超出单个PHP进程内存限定(要为100万个数字供应内存空间):

下面我们来改进实现方案,利用天生器实现如下:

function makeRange($length) { for ($i=0; $i<$length; $i++) { yield $i; }}foreach (makeRange(1000000) as $i) { echo $i . PHP_EOL;}

再次实行就可以毫无压力的打印出结果,由于天生器每次只须要为一个整数分配内存。

此外,一个常用的利用案例便是利用天生器迭代流资源(文件、音频等)。
假设我们想要迭代一个大小为4GB的CSV文件,而虚拟私有做事器(VPS)只许可PHP利用1GB内存,因此不能把全体文件都加载到内存中,下面的代码展示了如何利用天生器完成这种操作:

function getRows($file) { $handle = fopen($file, 'rb'); if ($handle == FALSE) { throw new Exception(); } while (feof($handle) === FALSE) { yield fgetcsv($handle); } fclose($handle);}foreach ($getRows($file) as $row) { print_r($row);}

上述示例一次只会为CSV文件中的一行分配内存,而不会把全体4GB的CSV文件都读取到内存中。

4、总结

天生器是功能多样性和简洁性之间的折上钩划,天生器只是向提高的迭代器,这意味着不能利用天生器在数据集中实行退却撤退、快进或查找操作,只能让天生器打算并产出下一个值。
迭代大型数据集或数列时最适宜利用天生器,由于这样占用的系统内存最少。
天生器也能完成迭代器能完成的大略任务,而且利用的代码更少。

总而言之,天生器并没有为PHP添加新功能,不过利用天生器大大简化了某些任务

标签:

相关文章

语言枚举类型,探索人类语言多样性的奥秘

语言是人类交流的重要工具,也是人类文明发展的重要标志。随着全球化进程的不断推进,各种语言枚举类型应运而生。本文将从语言枚举类型的定...

SEO优化 2024-12-29 阅读0 评论0

语言栏消失,科技变革下的挑战与机遇

近年来,随着科技的飞速发展,智能手机、平板电脑等移动设备的普及,语言栏这一功能已经成为了我们日常生活中不可或缺的一部分。近期有消息...

SEO优化 2024-12-29 阅读0 评论0

语言混合现象的多元魅力与挑战

语言混合作为一种跨文化交流的现象,逐渐成为世界范围内语言学研究的热点。它不仅丰富了语言的多样性,也反映了全球化背景下人类社会的交流...

SEO优化 2024-12-29 阅读0 评论0

语言是思想的载体,介绍语言与思想的关系

在人类文明的进程中,语言一直扮演着至关重要的角色。它不仅是人们沟通交流的工具,更是承载着人类思想的载体。自古以来,人们就深知语言与...

SEO优化 2024-12-29 阅读0 评论0