合肥地区建网站公司,德州网站怎样建设,爱星光(istar)高端网站建设,平台开发者image.png开头介绍的这个文章总结的很详细#xff0c;而且大多的介绍其实都是这么写的#xff0c;也是这些例子。但是手册的介绍也很重要。此处#xff0c;我主要写一些个人的理解要点1.生成其是一种更容易实现简单对象迭代。所以他的本质其实是相当于有助于更好的实现 fore…image.png开头介绍的这个文章总结的很详细而且大多的介绍其实都是这么写的也是这些例子。但是手册的介绍也很重要。此处我主要写一些个人的理解要点1.生成其是一种更容易实现简单对象迭代。所以他的本质其实是相当于有助于更好的实现 foreach 等方式的迭代系能和复杂性大大降低3.生成器允许你在 foreach 代码块中写迭代一组数据而不需要在内容中创建一个数组。(正常来说我们都是遍历后赋值给一个变量但生成器允许你直接使用 yield 接受变量并最终返回)4.生成器可以根据需求对此执行 yield1.要知道 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 ) : scalarabstract public [next](http://php.net/manual/zh/iterator.next.php) ( void ) : voidabstract public [rewind](http://php.net/manual/zh/iterator.rewind.php) ( void ) : voidabstract public [valid](http://php.net/manual/zh/iterator.valid.php) ( void ) : bool}demo.phpfunction createRage($num 10){for ($i 0; $i $num; $i) {yield time();}}foreach (createRage(10) as $item) {sleep(1);echo $item.;}image.pngyield.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(); //393088echo ;echo microtime(true)-$start; // 结果 6.6504390239716foreach.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 ;echo microtime(true)-$start;image.png如果数据小一点我拿 1000000 十万的数据测试发现使用 yield 是可以快2s左右。已经是一个很大的差距了image.png注意 生成器生成的结果是一个生成器对象可以通过 foreach 遍历获取所有的数据但是不能够直接像一个数组一样的对待他image.png