• 技术文章 >后端开发 >php教程

    PHP生成器Generators的简单解析

    不言不言2018-08-04 09:28:46原创899
    这篇文章给大家介绍的内容是关于PHP生成器Generators的简单解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    什么是生成器Generators

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

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

    例子代码:

    <?php
    /**
     * Created by PhpStorm.
     * User: chenbotome@163.com
     * Date: 2018/7/30
     * Time: 上午11:29
     */
    $start = xdebug_memory_usage();
    $num = 10000;
    function rangeWithGenerators($start, $limit, $step = 1) {
        if ($start < $limit) {
            if ($step <= 0) {
                throw new LogicException('Step must be +ve');
            }
    
            for ($i = $start; $i <= $limit; $i += $step) { 
            yield $i;
            }
             } else { 
             if ($step >= 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 . "\n";
        }
        //var_dump(iterator_to_array($iterate));
    }
    if ($argc === 2) {
        $test = range(0, $num, 1);
        foreach ($test as $value) {
            echo $value . "\n";
        }
    }
    $end = xdebug_memory_usage();
    
    echo sprintf("内存消耗量%s\n", 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];
    }

    环境

    执行命令

    测试结果论述

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

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

    相关文章推荐:

    PHP中json_encode的使用方法介绍

    php如何使用curl接收POST地址即创建一个接口的方法

    以上就是PHP生成器Generators的简单解析的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php
    上一篇:PHP中json_encode的使用方法介绍 下一篇:PHP7中生成器的新特性:生成器委托( yield-from )&返回值(return-value)
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 2022最新浅析PHP特性、内核及架构• 教你创建虚拟主机并运行php项目(phpstudy + wamp)• 一文详细PHP模板引擎的原理(附代码示例)• PHP 5.0对象模型深度探索之访问方式_PHP• PHP中重新定向到另一个页面_PHP
    1/1

    PHP中文网