PHP 天生器是甚么?
天生器是正在 PHP 5.5 版本中增加的,它提供了一种简略的办法来遍历数据,而没有需求正在内存中构建数组。是否是有点纳闷?那举一个例子,展现应用天生器是一个好形式。
起首,创立一个 generator.php 文件,它将贯通咱们整个例子。创立文件之后,咱们增加一段代码。
<?php function getRange ($max = 10) { $array = []; for ($i = 1; $i < $max; $i++) { $array[] = $i; } return $array; } foreach (getRange(15) as $range) { echo "Dataset {$range} <br>"; }
咱们能够正在创立 generator.php 文件所正在目次中疾速启动一个内置的 PHP 效劳器:
php -S localhost:8000
假如用阅读器关上 http://localhost:8000/generator.php ,咱们应该看到这样的后果:
这段代码的自诠释性并非太好。让咱们略微改动一下代码
<?php foreach (getRange(PHP_INT_MAX) as $range) { echo "Dataset {$range} <br>"; }
如今,下面的这段代码可以天生的最年夜值是 PHP_INT_MAX (也就是 PHP 可以天生的最年夜值). 当咱们这样修正后刷新阅读器,咱们留意到此次有一些纷歧样。这段天生器剧本抛出了一条 warning 信息 .
有点遗憾的是 PHP 耗尽了内存。你可以想到的处理办法可能包罗添加 php.ini 文件中 memory_limit 的下限。不外平心而论,这个剧本既没有高效又占用内存,咱们需求的是一个高效且占用内存低的剧本。
应用天生器
让咱们正在下面界说相反的函数,用相反的值 PHP_INT_MAX 挪用它,而后再次运转。然而这一次咱们将创立一个天生器函数。
<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { yield $i; } } foreach (getRange(PHP_INT_MAX) as $range) { echo "Dataset {$range} <br>"; }
解析 getRange 函数,此次,咱们只轮回遍历值以及 yield 输入。 yield 与前往值相似,由于它也是从函数前往一个值,但惟一的区分是 yield 只会正在需求时前往一个值,而且没有会测验考试将整个数据集保存正在内存中。
假如您转到阅读器,您应该会看到页面上显示的数据。给定适当的工夫,阅读器终极显示数据。
留意: 天生器只能正在函数中应用。
为何要应用天生器
有时分,咱们可能会遇到想要解析一个宏大的数据集(也多是日记文件),也可能对一个年夜型数据库的后果集执行较量争论,等等状况。咱们没有想让这些数据全副加载到内存中。咱们应该尽可能的保留相应的内存状态。数据纷歧定要很年夜 —— 无论数占有多小,天生器都是无效的。别忘了,咱们的目的是应用更少的内存来尽可能快的解决数据。
前往键值对
有时分,咱们的数据是基于 key-value 时才更有压服力。应用天生器时,咱们可能会天生上面这样的键值对。
<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { $value = $i * mt_rand(); yield $i => $value; } }
而后,咱们能够应用这个键值对,就像应用恣意的数组同样。
<?php foreach (getRange(PHP_INT_MAX) as $range => $value) { echo "Dataset {$range} has {$value} value<br>"; }
通报参数到天生器中
天生器也能接纳传参。这象征这天生器容许咱们向此中注入参数,作为一个饬令或许其余作用。例如,咱们向天生器发送一个值,让它中止执行或许修正输入后果。应用下面的 getRange 函数,咱们能够完成这一点。
<?php function getRange ($max = 10) { for ($i = 1; $i < $max; $i++) { $injected = yield $i; if ($injected === 'stop') return; } }
要发送注入这个值,咱们能够这样做。
<?php $generator = getRange(PHP_INT_MAX); foreach ($generator as $range) { if ($range === 10000) { $generator->send('stop'); } echo "Dataset {$range} <br>"; }
留意: 正在天生器中应用 return ,会跳出身成器。
没有要滥用天生器
尽管应用 PHP_INT_MAX 有点过了。但对我来讲, PHP_INT_MAX 即 2147483647 也就是:
二十亿四千七百四十万四千八万三千六百四十七
天生器使内存应用更高效。但若滥用,同样会造成内存相干的成绩。
总结
天生器提供了难以漠视的明显性的能晋升。年夜少数的时分,咱们没有需求高设置装备摆设的效劳器来运转代码。咱们只要要做一点重构,天生器长短常有用的,咱们应该多多应用它们。
保举教程:《Laravel教程》《PHP教程》《PHP7》
以上就是PHP 中的天生器(Generator)详解的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学 生成器 generator
抱歉,评论功能暂时关闭!