1. <output id="5rrzn"></output>

        <dl id="5rrzn"><ins id="5rrzn"><strong id="5rrzn"></strong></ins></dl><dl id="5rrzn"><font id="5rrzn"><nobr id="5rrzn"></nobr></font></dl>
        1. PHP 新特性:生成器的创建和使用

          码农程序 / 2019-03-18 19:30:50

          本公众号只做学习分享,本公众号会不定期的给大家分享视频教学教程,项目源码,文章最新动态等,感谢大家的支持!


          抖音号startphp

          用短视频和大家分享PHP学习方法,学习技巧与经验分享,

          欢迎关注抖音号:startphp


          教程力荐

          要提升自己的学习能力的同学,自己还是要拥有一本属于自己的书的,因为你在忘记的时候可以经常拿出来翻阅一下,巩固一下。


          文章内容

          1、概述

          生成器是 PHP 5.5 引入的新特性,但是目测很少人用到它,其实这是个非常有用的功能。

          生成器和迭代器有点类似,但是与标准的PHP迭代器不同,PHP生成器不要求类实现Iterator接口,从而减轻了类的开销和负担。生成器会根据需求每次计算并产出需要迭代的?#25285;?#36825;对应用的性能有很大的影响:试想假如标准的PHP迭代器经常在内存中执行迭代操作,这要预先计算出数据集,性能低下;如果要使用特定方式计算大量数据,如操作Excel表数据,对性能影响更甚。此时我们可以使用生成器,即时计算并产出后续?#25285;?#19981;占用宝贵的内存?#21344;洹?/p>

          2、创建生成器

          生成器的创建方式很简单,因为生成器就是PHP函数,只不过要在函数中一次或多次使用yield关键字。与普通的PHP函数不同的是,生成器从不返回?#25285;?#21482;产出值。下面是一个简单的生成器实现:

          function getLaravelAcademy() {
              yield 'http://LaravelAcademy.org';
              yield 'Laravel学院';
              yield 'Laravel Academy';
          }

          很简单吧!调用此生成器函数时,PHP会返回一个属于Generator类的对象,这个对象可以使用foreach函数迭代,每次迭代,PHP会要求Generator实例计算并提供下一个要迭代的值。生成器的优雅体现在每次产出一个值之后,生成器的内部状态都会停顿;向生成器请求下一个值时,内部状态?#21482;?#24674;复。生成器内部的状态会一直在停顿和恢复之间?#35874;唬?#30452;到?#25191;?#20989;数定义体的末?#19981;?#36935;到空的return语句为止。我们可以使用下面的代码调用并迭代上面定义的生成器:

          foreach(getLaravelAcademy() as $yieldedValue) {
              echo $yieldedValue, PHP_EOL;
          }


          上面代码输出如下:

          http://LaravelAcademy.org
          Laravel学院
          Laravel Academy

          3、使用生成器

          下面我们实现一个简单的函数用于生成一个范围内的数?#25285;源?#35828;明生成器是如何节省内存的。首先我们通过迭代器来实现:

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

          $customRange = makeRange(1000000);
          foreach ($customRange as $i) {
              echo $i . PHP_EOL;
          }


          此时执行会报错,提示超出单个PHP进程内存限制(要为100万个数字提供内存?#21344;洌?/p>

          下面我们来改进实现方案,使用生成器实现如下:

          function makeRange($length) {
              for ($i=0; $i<$length; $i++) {
                  yield $i;
              }
          }

          foreach (makeRange(1000000as $i) {
              echo $i . PHP_EOL;
          }


          再次执行就可以毫无压力的打印出结果,因为生成器每次只需要为一个整数分配内存。

          此外,一个常用的使用案例就是使用生成器迭代流资源(文件、音频等)。假设我们想要迭代一个大小为4GB的CSV文件,而虚拟私有服务器(VPS)只允许PHP使用1GB内存,因此不能把整个文件?#25216;?#36733;到内存中,下面的代码展示了如何使用生成器完成这种操作:

          function getRows($file) {
              $handle = fopen($file, 'rb');
              if ($handle == FALSE) {
                  throw new Exception();
              }
              while (feof($handle) === FALSE) {
                  yield fgetcsv($handle);
              }
              fclose($handle);
          }

          foreach ($getRows($file) as $row) {
              print_r($row);
          }

          上述示例一次只会为CSV文件中的一行分配内存,而不会把整个4GB的CSV文件都读取到内存中。

          4、总结

          生成器是功能多样性和简洁性之间的折中方案,生成器只是向前进的迭代器,这意味着不能使用生成器在数据集中执行后退、快进或查找操作,只能让生成器计算并产出下一个值。迭代大型数据集或数列时最适合使用生成器,因为这样占用的?#20302;?#20869;存最少。生成器也能完成迭代器能完成的简单任务,而且使用的代码更少。

          总而言之,生成器并没有为PHP添加新功能,不过使用生成器大大简化了某些任务


          以上是文章的全部内容,有需要交流与学习的,有需要视频教程的可以上微店查看查看。



          足球外围投注app

              1. <output id="5rrzn"></output>

                <dl id="5rrzn"><ins id="5rrzn"><strong id="5rrzn"></strong></ins></dl><dl id="5rrzn"><font id="5rrzn"><nobr id="5rrzn"></nobr></font></dl>

                      1. <output id="5rrzn"></output>

                        <dl id="5rrzn"><ins id="5rrzn"><strong id="5rrzn"></strong></ins></dl><dl id="5rrzn"><font id="5rrzn"><nobr id="5rrzn"></nobr></font></dl>