资讯专栏INFORMATION COLUMN

PHP 生成器Generators的入门理解和学习

Shimmer / 2311人阅读

摘要:例子代码上午内存消耗量环境执行命令结果返回内存消耗量结果返回内存消耗量测试结果论述通过代码的执行,比较除了标准函数和自定义函数之间的异同。标准函数,该函数将转换为一个。使用场景,可查阅参考资料参考资料实际生产中的使用

什么是生成器Generators

生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。

一个简单的例子就是使用生成器来重新实现 range() 函数。 标准的 range() 函数需要在内存中生成一个数组包含每一个在它范围内的值,然后返回该数组, 结果就是会产生多个很大的数组。 比如,调用 range(0, 10000) 将导致内存占用超过 4 MB。

例子代码

= 0) {
            throw new LogicException("Step must be -ve");
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}
if ($argc === 1) {
    $iterate = rangeWithGenerators(0, $num, 1);
    foreach ($iterate as $value){
        echo $value . "
";
    }
    //var_dump(iterator_to_array($iterate));
}
if ($argc === 2) {
    $test = range(0, $num, 1);
    foreach ($test as $value) {
        echo $value . "
";
    }
}
$end = xdebug_memory_usage();

echo sprintf("内存消耗量%s
", convert($end-$start));

function convert($size){
    $unit=array("b","kb","mb","gb","tb","pb");
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2)." ".$unit[$i];
}

环境

PHP7.1

Xdebug

执行命令

php test.php 结果返回:内存消耗量416 b

php test.php range 结果返回:内存消耗量4 mb

测试结果论述

通过代码的执行,比较除了PHP标准函数rang()和自定义函数rangeWithGenerators()之间的异同。实现了同样的目的,却消耗着不同的内存,生成器的优点显而易见。

rangeWithGenerators()使用了生成器,而生成器的关键就是使用yield关键词,yield常见的使用涉及到foreach和for两个流程控制语句。rangeWithGenerators()中for循环yield变量$i(yield可理解为生成-值,如同return可理解为返回-值)。

rangeWithGenerators()函数返回的便是一个生成器Generators( 使用var_dump($iterate)查看其类型 )。

既然rangeWithGenerators()函数返回的是一个生成器,我们可以使用以下两种方式来使用:

foreach循环该Generators,本例子中则使用该方法读取Generators。

PHP标准函数iterator_to_array(),该函数将Generators转换为一个Array。

使用场景,可查阅参考资料2

参考资料:

http://php.net/manual/zh/lang...
实际生产中的使用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29153.html

相关文章

  • PHP 成器入门

    摘要:执行语句的唯一目的是结束生成器执行。这就是需要生成器需要有返回值的意义,这也是为何我们将这个特性加入到中的原因,我们会将最后执行的值作为返回值,但这不是一个好的解决方案。 本文首发于 入门 PHP 生成器,转载请注明出处。 PHP 在 5.5 版本中引入了「生成器(Generator)」特性,不过这个特性并没有引起人们的注意。在官方的 从 PHP 5.4.x 迁移到 PHP 5.5.x...

    IamDLY 评论0 收藏0
  • yeoman-generator 入门教程

    摘要:上下文路径为了方便文件流的输入输出,使用两种位置环境。目标上下文目标上下文定义为当前工作目录或含文件最接近的父文件夹。这确保了用户行为的一致。帮助用户严重需要覆盖的内容。 摘要 随着 Web 2.0 和 HTML 5 的流行,现在的 Web 应用所能提供的功能和交互能力比之前传统的 Web 应用要强大很多。应用的很多实现逻辑被转移到了浏览器端来实现。浏览器不再只提供单一的数据接收和展现...

    caiyongji 评论0 收藏0
  • 人人必备10个 Laravel 4 扩展包

    摘要:更多扩展包中有丰富的扩展包来帮你完成几乎任何你想实现的功能。我们不能把所有的扩展包都整理出来,然而,这里还是列出了一些很有用的。总之,你几乎总是能够找到一个扩展包可以解决你当前的问题。 Laravel 是一个非常流行且简单易用的PHP框架,它提供了很多基础的工具(如 RESTful 路由、内置的ORM、模版等)使你能够快速的创建应用。这意味着你可以花费更少的时间来建立应用程序的模版,给...

    darkbug 评论0 收藏0
  • Node.js 入门你需要知道 10 个问题

    摘要:什么是在中什么时候需要是中的包管理器。允许我们为安装各种模块,这个包管理器为我们提供了安装删除等其它命令来管理模块。 showImg(https://user-gold-cdn.xitu.io/2019/7/11/16bde5b2df52a924?w=4000&h=2667&f=jpeg&s=450648); 本文为您分享「Node.js 入门你需要知道的 10 个问题」这些问题可能也...

    szysky 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<