PHP 中的生成器(Generator)详解-php教程

资源魔 33 0
谈到驾驶,速率并不是所有。但正在网络上,速率变患上异乎寻常。你的使用顺序越快,用户体验越好。这篇文章是对于 PHP 天生器的,那末咱们为何要探讨速率呢?你很快就会发现,天生器正在速率以及内存的治理上施展着微小的作用。

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 ,咱们应该看到这样的后果:

微信截图_20200511103244.png

这段代码的自诠释性并非太好。让咱们略微改动一下代码

<?php
foreach (getRange(PHP_INT_MAX) as $range) {
    echo "Dataset {$range} <br>";
}

如今,下面的这段代码可以天生的最年夜值是 PHP_INT_MAX (也就是 PHP 可以天生的最年夜值). 当咱们这样修正后刷新阅读器,咱们留意到此次有一些纷歧样。这段天生器剧本抛出了一条 warning 信息 .

微信截图_20200511103258.png

有点遗憾的是 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

抱歉,评论功能暂时关闭!