php 生成器作用,php 生成器的理解和使用

6f1aeaa4c8dc

image.png

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

1.生成其是一种更容易实现简单对象迭代。所以他的本质其实是相当于有助于更好的实现 foreach 等方式的迭代

系能和复杂性大大降低

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

function createRage($num = 10)

{

for ($i = 0; $i < $num; $i++) {

yield time();

}

}

foreach (createRage(10) as $item) {

sleep(1);

echo $item.'
';

}

6f1aeaa4c8dc

image.png

yield.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 '
';

echo microtime(true)-$start; // 结果 6.6504390239716

foreach.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;

6f1aeaa4c8dc

image.png

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

6f1aeaa4c8dc

image.png

注意 生成器生成的结果是一个生成器对象,可以通过 foreach 遍历获取所有的数据,但是不能够直接像一个数组一样的对待他

6f1aeaa4c8dc

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

沈向洋谈文献阅读(转载)

1. 很多研究者话费一半以上的时间用来阅读。在研究生开始两年&#xff0c;除了应付功课&#xff0c;其余的时间阅读有关于你topic的课本和journal articles。 2. 了解自己相关topic最为核心的杂志。每年去图书馆翻阅过去一年相关大学的研究者做出的引起你兴趣的technical repor…

php访问url json,PHP操作URL和PHP操作json

摘要&#xff1a;<?php //url$string 我爱 中国;$string htmlspecialchars($string);echo $strin<?php //url$string 我爱 中国;$string htmlspecialchars($string);echo $string;echo ;$url http://www.bai du.com;echo $url urldecode($url);echo ;echo $url …

hdu 3079水题

水到什么都不想说了。 /** hdu3079/win.cpp* Created on: 2012-11-4* Author : ben*/ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <iostream> #include <algorithm> …

java maximumpoolsize,如果maximumPoolSize小于corePoolSize怎么办? Java 6中可能存在的错误?...

我遇到了Java 6的ThreadPoolExecutor一个奇怪的问题 . 我不时地动态更改了corePoolSize&#xff0c;我观察到线程池没有处理应该完成的任务 .例如&#xff0c;如果我有4个corePoolSize并且队列中有许多任务等待&#xff0c;那么执行程序最多处理3个&#xff0c;有时甚至是2个 .…

print\println\printf的区别

print\println\printf的区别 print将它的参数显示在命令窗口&#xff0c;并将输出光标定位在所显示的最后一个字符之后。 println 将它的参数显示在命令窗口&#xff0c;并在结尾加上换行符&#xff0c;将输出光标定位在下一行的开始。 printf是格式化输出的形式。 下在举个例子…

哪里学php开发,哪里学web开发

在开始学习Web开发时&#xff0c;我建议做的第一件事就是确定明确的最终目标&#xff0c;并牢记其中。也许你想改变职业生涯。也许你对应用程序有一个邪恶的想法。或许你只是想学习乐趣。无论您的目标是什么&#xff0c;了解您为什么这样做都很重要。这种理解将帮助您提高学习时…

对PostgreSQL中后台进程内存挂载的初步学习

开始 从 CreateSharedMemoryAndSemaphores 开始&#xff1a; 对于 Postmaster 的各个子进程而言&#xff0c;内存结构在 Postmaster 中已经建立&#xff0c;只是需要挂到各子进程自己的本地变量上。 /* * CreateSharedMemoryAndSemaphores …

四阶龙格积分法 matlab,matlab控制系统计算机仿真实验-完整版

MALTAB 仿真实验指导书实验一实验题目&#xff1a;欧拉法&梯形法的MATLAB 实现实验目的&#xff1a;1.熟练掌握MATLAB 的使用方法2.牢记欧拉法、梯形法的计算过程3.熟悉欧拉法、梯形法以及实现二阶动态响应的程序编写 实验内容&#xff1a;已知被控对象的系数矩阵分别为A[-…

前端学习(590):调试javascript的流程

vs 安装live server插件 第一种方式 第二种方式 使用alert 断点调试debugger 断点调试 断点调试 设置断点

统一管理MOSS2010用户头像

我们都知道MOSS 2010里面的“我的网站”里面有一个上传照片功能&#xff0c;通过那里用户可以方便的上传自己的照片。也可以通过在AD里面上传用户的头像&#xff0c;通过MOSS的 User Profile Service Application 服务进行同步&#xff0c;实现MOSS,Outlook,Lync 头像的统一管理…

开博第一篇-ios

最近在工作之余学习了ios上的编程&#xff0c;感觉3G时代了&#xff0c;自己应该会些时代的东西&#xff01; 由于是java出身&#xff0c;所以开始看objective-c时很别扭&#xff0c;但慢慢的看的话还是蛮有趣的&#xff01; 最初买了本ios的编程教程&#xff0c;有点老&#x…

php代码质量怎么提高,如何提高PHP代码的质量?第一部分 自动化工具

重复的代码是不好的&#xff0c;每个人都知道。有时我们错误地创建了这样的代码&#xff0c;我们从来没有注意到它。有时我们这样做是因为我们懒惰。最好是配备一个工具&#xff0c;它可以在构建时提示这个问题。PHPCPD - PHP复制/粘贴检测器。通过运行以下命令来安装它&#x…

第二周周四DailyReporting——PM(李忠)

这几天不知道怎么的&#xff0c;项目一直进展缓慢&#xff0c;心里有些着急&#xff0c;下面是几个总结&#xff1a; &#xff08;1&#xff09;数据库来的时候&#xff0c;我们的能否承受大数据的考验&#xff1b; &#xff08;2&#xff09;组员这几天都有些闲&#xff0c;不…

matlab多缝夫琅禾费,常见的多缝夫琅禾费衍射.ppt

常见的多缝夫琅禾费衍射* * 5.8 多缝夫琅禾费衍射 所谓多缝是指在一块不透光的屏上&#xff0c;刻有 N 条等间距、等宽度的通光狭缝。夫琅禾费多缝衍射的装置如图所示。其每条狭缝均平行于 y1 方向&#xff0c;沿 x1 方向的缝宽为 a&#xff0c;相邻狭缝的间距为 d&#xff0c;…

php 判断心跳包报错,第29问:MySQL 的复制心跳说它不想跳了

问题最近年末&#xff0c;你们的数据库常常跑批量大事务&#xff0c;会发现复制忽然断开&#xff0c;报错“心跳与本地信息不兼容”&#xff1a; 会是什么缘由&#xff1f;php 实验咱们先来复现一下&#xff0c;再进行分析。html宽油&#xff0c;作一对主从数据库&#xff1a;m…