zoukankan      html  css  js  c++  java
  • 上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator

    轻量级“集合”迭代器-Generator
    泊学视频链接
    泊阅文档链接
    Generator是PHP 5.5加入的新语言特性。但是,它似乎并没有被很多PHP开发者广泛采用。因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下Generator究竟为我们解决什么问题。


    一千万个整数的数组

    如果我们要“创建一个指定元素个数的数组”,怎么做呢?我们可能会不加思索的写下下面的代码:

    function makeRange($range) {
        $data = [];
    
        for ($i = 0; $i < $range; $i++) {
            $data[] = $i;
        }
    
        return $data;
    }
    

    然后,在我们的开发环境里,分别创建1万个,10万个,100万个元素的数组,一切看起来都如我们想象。

    makeRange(10000);
    makeRange(100000);
    makeRange(1000000);
    

    但是,当我们创建一个包涵1千万个整数的数组时,情况就不一样了,系统没有那么多内存分配给我们:

    makeRange(10000000);


    在资源有限的情况下,解决大文件或大批量数据的处理问题,就是PHP generator的一个典型应用。

    把PHP Generator请出来帮忙

    定义PHP generator很简单,看上去就像定义一个函数一样:

    function makeRangeByGenerator($range) {    
    for ($i = 0; $i < $range; $i++) { 
        yield $i;
        }
    }
    

    只是,makeRangeByGenerator没有返回值,也没有把整个数组创建在内存里,而只是通过关键字yield,标记了每次循环应该生成的值。接下来,我们可以像访问一个普通集合一样使用generator:

    foreach ($makeRangeByGenerator(100) as $i) {
        echo $i.'<br>';
    }


    现在重新执行我们的PHP文件,就不会再报错了。并且,我们可以在页面上,看到generator生成的值。这就是generator的典型应用场景,简单来说:Generator就是一个轻量级迭代器,它可以自动的记住每一次被调用时的状态,并返回给我们正确的值。

    PHP 7做了哪些改进?

    了解了generator的基本用法之后,我们就可以看一下PHP 7对它做了哪些改进了。

    • PHP 7允许我们给generator加入返回值,就像我们定义函数的返回值一样:

      function makeRangeByGenerator($range) {

         for ($i = 0; $i < $range; $i++) {
             yield $i;
         }
      
         return "Finish yielding";

      }

    迭代完generator的所有元素时,我们就可以通过getReturn()方法,来读取generator的返回值:

    $gen = makeRangeByGenerator(100);
    
    foreach ($gen as $i) {
        echo $i.'<br>';
    }
    
    echo $gen->getReturn();


    *“我们必须在所有迭代完generator所有值之后,才能读取generator的返回值,否则PHP会报错。”
    ——最佳实践*

    • PHP 7对generator的第二个改进就是允许嵌套。例如:

    function outer() {
        yield "PHP 7 ";
        yield "is one of ";
        yield "the best ";
    
        yield from inner();
    }
    
    function inner() {
        yield "programming languages in the world";
    }
    

    我们使用关键字from引入一个新的generator,当我们遍历outer generator时,我们就会发现,它自动生成了inner generator的值:

    foreach(outer() as $str) {
        echo $str;
    }


    这就是关于PHP generator的全部内容。简单来说,generator就是一个轻量级的,可以记住自身状态的“集合”迭代器。如果你之前还不了解它,现在是时候考虑下它在哪些地方可以帮助到你了。

    了解更多优质IT技术,拓展阅读视野,欢迎大家访问我们的合作伙伴Segmentfault

    轻量级“集合”迭代器-Generator
    泊学视频链接
    泊阅文档链接
    Generator是PHP 5.5加入的新语言特性。但是,它似乎并没有被很多PHP开发者广泛采用。因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下Generator究竟为我们解决什么问题。


    一千万个整数的数组

    如果我们要“创建一个指定元素个数的数组”,怎么做呢?我们可能会不加思索的写下下面的代码:

    function makeRange($range) {
        $data = [];
    
        for ($i = 0; $i < $range; $i++) {
            $data[] = $i;
        }
    
        return $data;
    }
    

    然后,在我们的开发环境里,分别创建1万个,10万个,100万个元素的数组,一切看起来都如我们想象。

    makeRange(10000);
    makeRange(100000);
    makeRange(1000000);
    

    但是,当我们创建一个包涵1千万个整数的数组时,情况就不一样了,系统没有那么多内存分配给我们:

    makeRange(10000000);


    在资源有限的情况下,解决大文件或大批量数据的处理问题,就是PHP generator的一个典型应用。

    把PHP Generator请出来帮忙

    定义PHP generator很简单,看上去就像定义一个函数一样:

    function makeRangeByGenerator($range) {    
    for ($i = 0; $i < $range; $i++) { 
        yield $i;
        }
    }
    

    只是,makeRangeByGenerator没有返回值,也没有把整个数组创建在内存里,而只是通过关键字yield,标记了每次循环应该生成的值。接下来,我们可以像访问一个普通集合一样使用generator:

    foreach ($makeRangeByGenerator(100) as $i) {
        echo $i.'<br>';
    }


    现在重新执行我们的PHP文件,就不会再报错了。并且,我们可以在页面上,看到generator生成的值。这就是generator的典型应用场景,简单来说:Generator就是一个轻量级迭代器,它可以自动的记住每一次被调用时的状态,并返回给我们正确的值。

    PHP 7做了哪些改进?

    了解了generator的基本用法之后,我们就可以看一下PHP 7对它做了哪些改进了。

    • PHP 7允许我们给generator加入返回值,就像我们定义函数的返回值一样:

      function makeRangeByGenerator($range) {

         for ($i = 0; $i < $range; $i++) {
             yield $i;
         }
      
         return "Finish yielding";

      }

    迭代完generator的所有元素时,我们就可以通过getReturn()方法,来读取generator的返回值:

    $gen = makeRangeByGenerator(100);
    
    foreach ($gen as $i) {
        echo $i.'<br>';
    }
    
    echo $gen->getReturn();


    *“我们必须在所有迭代完generator所有值之后,才能读取generator的返回值,否则PHP会报错。”
    ——最佳实践*

    • PHP 7对generator的第二个改进就是允许嵌套。例如:

    function outer() {
        yield "PHP 7 ";
        yield "is one of ";
        yield "the best ";
    
        yield from inner();
    }
    
    function inner() {
        yield "programming languages in the world";
    }
    

    我们使用关键字from引入一个新的generator,当我们遍历outer generator时,我们就会发现,它自动生成了inner generator的值:

    foreach(outer() as $str) {
        echo $str;
    }


    这就是关于PHP generator的全部内容。简单来说,generator就是一个轻量级的,可以记住自身状态的“集合”迭代器。如果你之前还不了解它,现在是时候考虑下它在哪些地方可以帮助到你了。

    了解更多优质IT技术,拓展阅读视野,欢迎大家访问我们的合作伙伴Segmentfault

     
     
    原文:
    https://segmentfault.com/a/1190000004307491
  • 相关阅读:
    计算机基础数据结构讲解第九篇-顺序队列
    计算机基础数据结构讲解第八篇-栈
    计算机基础数据结构讲解第七篇-链表操作
    计算机基础数据结构讲解第六篇-顺序表操作
    计算机基础数据结构讲解第五篇-顺序表
    计算机基础数据结构讲解第三篇-B树和B+树
    计算机基础数据结构讲解第二篇-散列查找
    MLHPC 2018 | Aluminum: An Asynchronous, GPU-Aware Communication Library Optimized for Large-Scale Training of Deep Neural Networks on HPC Systems
    MXNet源码分析 | KVStore进程间通信
    链表类问题
  • 原文地址:https://www.cnblogs.com/chunguang/p/5538415.html
Copyright © 2011-2022 走看看