1. <?php
  2. function getLines($file) {
  3. $f = fopen($file, 'r');
  4. try {
  5. while ($line = fgets($f)) {
  6. yield $line;
  7. }
  8. } finally {
  9. fclose($f);
  10. }
  11. }
  12.  
  13. foreach (getLines("sql.txt") as $n => $line) {
  14. echo $line; //逐行输出大文件
  15. }
  16.  
  17. /*-----------------------------------------------------------------------*/
  18. function xrange($start, $end, $step = 1) {
  19. for ($i = $start; $i <= $end; $i += $step) {
  20. yield $i;
  21. }
  22. }
  23.  
  24. foreach (xrange(1, 1000) as $num) {
  25. echo $num, "\n"; //生成大数组
  26. }
  27.  
  28. /*-----------------------------------------------------------------------*/
  29. function get(){
  30. $sql = "select * from `user` limit 0,500000000";
  31. $stat = $pdo->query($sql);
  32. while ($row = $stat->fetch()) {
  33. yield $row;//逐行读出数据库行
  34. }
  35. }
  36.  
  37. foreach (get() as $row) {
  38. var_dump($row);
  39. }
  40.  
  41. /*-----------------------------------------------------------------------------*/
  42. function middleware($handlers,$arguments = []){
  43. //函数栈
  44. $stack = [];
  45. $result = null;
  46.  
  47. foreach ($handlers as $handler) {
  48. // 每次循环之前重置,只能保存最后一个处理程序的返回值
  49. $result = null;
  50. $generator = call_user_func_array($handler, $arguments);
  51.  
  52. if ($generator instanceof \Generator) {
  53. //将协程函数入栈,为重入做准备
  54. $stack[] = $generator;
  55.  
  56. //获取协程返回参数
  57. $yieldValue = $generator->current();
  58.  
  59. //检查是否重入函数栈
  60. if ($yieldValue === false) {
  61. break;
  62. }
  63. } elseif ($generator !== null) {
  64. //重入协程参数
  65. $result = $generator;
  66. }
  67. }
  68.  
  69. $return = ($result !== null);
  70. //将协程函数出栈
  71. while ($generator = array_pop($stack)) {
  72. if ($return) {
  73. $generator->send($result);
  74. } else {
  75. $generator->next();
  76. }
  77. }
  78. }
  79. $abc = function(){
  80. echo "this is abc start \n";
  81. yield;
  82. echo "this is abc end \n";
  83. };
  84.  
  85. $qwe = function (){
  86. echo "this is qwe start \n";
  87. $a = yield;
  88. echo $a."\n";
  89. echo "this is qwe end \n";
  90. };
  91. $one = function (){
  92. return 1;
  93. };
  94.  
  95. middleware([$abc,$qwe,$one]);

  

PHP生成器yield使用示例的更多相关文章

  1. PHP性能优化利器:生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  2. PHP 生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  3. python3使用迭代生成器yield减少内存占用

    技术背景 在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中.其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会 ...

  4. Python入门之迭代器/生成器/yield的表达方式/面向过程编程

    本章内容 迭代器 面向过程编程 一.什么是迭代 二.什么是迭代器 三.迭代器演示和举例 四.生成器yield基础 五.生成器yield的表达式形式 六.面向过程编程 ================= ...

  5. [PY3]——函数——生成器(yield关键字)

    函数—生成器篇 1. 认识和区分可迭代or生成器 1.1 可迭代对象 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象 当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代 ...

  6. 6 生成器 yield 协程

    1.生成器 ----> 1 b = [x*2 for x in range(100000000000)] MemoryError: 想生成一个存放很多数据的列表,但是又不想内存占用太多 每次用一 ...

  7. day4 内置函数 迭代器&生成器 yield总结 三元运算 闭包

    内置函数: 内置函数 # abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. b = -100 print(b) print(abs(b)) # all() 所有为真才为真,只要有一 ...

  8. Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递

    python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...

  9. 生成器 yield

    由于生成器的其中一种创建方式与列表推导式很相似,这里先说一下列表推导式. 列表推导式 列表推导式又叫列表生成式,官方叫做 list comprehension.顾名思义,这个是用来生成列表的. 用法: ...

随机推荐

  1. SpringBoot从Eclipse添加的Tomcat容器中启动

    SpringBoot的Web项目,想要在Eclipse中的Tomcat容器中启动运行需要做下面这两处改动 pom.xml <packaging>war</packaging> ...

  2. 好客租房39-react组件基础总结

    1组件的两种创建方式:函数组件和类组件 2无状态函数组件 负责静态结构展示 3有状态组件 负责更新ui 让页面动起来 4绑定事件注意this指向问题 5使用受控组件创建表单 6完全利用js语言的能够力 ...

  3. Vue项目中的接口进阶使用

    创建services文件夹 1.文件夹apis.index.request的三个文件. 2.apis文件放接口 export const apis = { checkDeviceNo: '/api/c ...

  4. github新项目npm错误

    当我们从GitHub或者别人那里拿到项目的时候,一般都是要先npm install 进行安装依赖.但是难免会遇到报错. 出现问题1: 解决方案:清除缓存npm cache clear --force之 ...

  5. C#中的CSV文件读写

    目录 CSV文件标准 文件示例 RFC 4180 简化标准 读写CSV文件 使用CsvHelper 使用自定义方法 基于简化标准的写CSV文件 使用TextFieldParser解析CSV文件 使用正 ...

  6. 为什么要使用TypeScript(Why Typescript?)

    客观原因 静态类型. 在编译期即可进行静态类型分析, 减少JS运行时类型错误. 语法功能强大 对于大型项目具有更好构建机制,加入了类.接口.泛型.模块等概念. 兼容JavaScript 与现存的Jav ...

  7. 【RocketMQ】Broker服务注册

    Broker注册 在Broker的启动函数中,添加了定时向NameServer进行注册的任务,在启动后延迟10秒向NameServer进行注册,之后定时发送心跳包,关于发送周期,首先从Broker配置 ...

  8. JS:表达式

    js代码的形式: 1.直接量 2.表达式 3.语句 1; "a"; true; null; var a; function fn(){}; b; var c = 20; var f ...

  9. Error: $controller:ctrlreg A controller with this name is not registered.

    The controller with the name 'SomeController' is not registered.名称为'SomeController'的控制器没注册 : Descrip ...

  10. 7 个有趣的 Python 实战项目,超级适合练手

    关于Python,有一句名言:不要重复造轮子. 但是问题有三个: 1.你不知道已经有哪些轮子已经造好了,哪个适合你用.有名有姓的的著名轮子就400多个,更别说没名没姓自己在制造中的轮子. 2.确实没重 ...