共计 1578 个字符,预计需要花费 4 分钟才能阅读完成。
一:生成器的概念:
生成器提供了一种更容易的办法来实现简略的对象迭代,生成器容许你在 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 文件中内容了