一:生成器的概念:
生成器提供了一种更容易的办法来实现简略的对象迭代,生成器容许你在 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文件中内容了