美文网首页
php 生成器的理解和使用

php 生成器的理解和使用

作者: 云龙789 | 来源:发表于2019-02-22 17:41 被阅读2次
    image.png

    开头介绍的这个文章总结的很详细,而且大多的介绍其实都是这么写的,也是这些例子。但是手册的介绍也很重要。此处,我主要写一些个人的理解要点

    • 1.生成其是一种更容易实现简单对象迭代。所以他的本质其实是相当于有助于更好的实现 foreach 等方式的迭代
      1. 系能和复杂性大大降低
    • 3.生成器允许你在 foreach 代码块中写迭代一组数据,而不需要在内容中创建一个数组。(正常来说我们都是遍历后赋值给一个变量,但生成器允许你直接使用 yield 接受变量,并最终返回)
    • 4.生成器可以根据需求,对此执行 yield

    1.要知道 yield 的使用是实现了 Iterator(迭代器)接口,而这个接口是有相应的方法的,最主要的是它是一步步执行的,一次循环后才能执行下一个。其实这种情况有点像队列,所以适合使用与处理大文件的读取或者大的数据的处理。但是变量的情况就是直接赋值在一个内存里面。
    2.还有就是 yield 其实相当于给一个返回的变量赋值,当所有的 yield 执行完毕后,将所有的值全部返回
    3.yiled 的写法必须用在函数里面,不可以单独的直接使用。

    **Iterator** extends **Traversable** {
    
    /* 方法 */
    
    abstract public [current](http://php.net/manual/zh/iterator.current.php) ( void ) : [mixed](http://php.net/manual/zh/language.pseudo-types.php#language.types.mixed)
    
    abstract public [key](http://php.net/manual/zh/iterator.key.php) ( void ) : scalar
    
    abstract public [next](http://php.net/manual/zh/iterator.next.php) ( void ) : void
    
    abstract public [rewind](http://php.net/manual/zh/iterator.rewind.php) ( void ) : void
    
    abstract public [valid](http://php.net/manual/zh/iterator.valid.php) ( void ) : bool
    
    }
    
    • demo.php
    <?php
    
    function createRage($num = 10)
    {
        for ($i = 0; $i < $num; $i++) {
            yield time();
        }
    }
    
    foreach (createRage(10) as $item) {
        sleep(1);
        echo $item.'<br>';
    }
    
    image.png
    • yield.php
    <?php
    
    $start = microtime(true);
    function createRage($num = 10)
    {
        for ($i = 0; $i < $num; $i++) {
            yield time();
        }
    }
    
    foreach (createRage(10000000) as $item) {
        echo PHP_EOL;
    }
    
    
    echo memory_get_usage(); //393088
    echo '<br>';
    echo microtime(true)-$start; // 结果 6.6504390239716
    
    • foreach.php
    <?php
    
    $start = microtime(true);
    function createRage($num = 10)
    {
        $data = [];
        for ($i = 0; $i < $num; $i++) {
            $data[] = time();
        }
        return $data;
    }
    
    foreach (createRage(10000000) as $item) {
        echo PHP_EOL;
    }
    
    
    echo memory_get_usage();
    echo '<br>';
    echo microtime(true)-$start;
    
    image.png

    如果数据小一点,我拿 1000000 十万的数据测试,发现使用 yield 是可以快2s左右。已经是一个很大的差距了

    image.png

    相关文章

      网友评论

          本文标题:php 生成器的理解和使用

          本文链接:https://www.haomeiwen.com/subject/gzoeyqtx.html