加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP yield 协程 生成器用法的认识

发布时间:2022-07-29 12:46:16 所属栏目:PHP教程 来源:互联网
导读:写在前面 这篇文章,要和大家探讨的是 PHP yield 在 生成器用法,不带 foreach,for, while 循环的那种。就讨论 yield 将一个函数变成为生成器的用法。 相关学习推荐:PHP编程从入门到精通 官网讲解 生成器允许你在 foreach 代码块中写代码来迭代一组数据而
   写在前面
  这篇文章,要和大家探讨的是 PHP yield 在 生成器用法,不带 foreach,for, while 循环的那种。就讨论 yield 将一个函数变成为生成器的用法。
 
  相关学习推荐:PHP编程从入门到精通
 
  官网讲解
  生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。
 
  看了下官网对他讲解:php.net 生成器语法 . 每个字都认识,但似乎还是体会到它讲的内涵。官网我们主要看两部分内容:
 
 
 
  <?phpfunction func(){
 
      $data = (yield [$express]);}
 
  语法就这样,估计大家还是有些懵,那就看看官网下面代码例子吧,我看里面例子参差不齐。
 
  注意yield 外面包的这一层括号,如果是在php5.5,右侧$express的优先级是判断,可能会比左侧$data的赋值语句低的。所以在php5用yield,yield 右边是可运行表达式,左侧需要接受返回并赋值,那么这个括号是有必要的。在php7不会有这个问题。
 
  通过例子来了解它
  不论是学 人类语言,计算机语言,都是模仿开始
 
  对于一个用人类语言来描述,都不那么明晰时,所以那就通过例子告诉你它能做什么,不能做什么。
 
  相关代码,我放到gitee了,希望你能复制到你本地运行下,亲自运行感受下,有助于了理解接下来的内容。
 
  git clone gitee.com/xupaul/PHP-generator-yie...
 
  怎样才能产生 Generator
  先定义一个函数,在函数内 写个 yield 关键词,将这个函数调用赋值给一个变量。一个生成器就产生了。
 
  代码 /php-yield-test/yieldFunctions.php 是生成器按照不同语法组合定义了多个生成器。
 
  测试代码 /php-yield-test/whatIsGenerator.php,用来检查哪些函数能构成生成器,哪些不能。运行结果如下
 
 
  生成器的函数
  Generator 对象是从 generators返回的.
 
  Generator 对象不能通过 new 实例化.
 
  Generator::current — 返回当前产生的值
  Generator::key — 返回当前产生的键
  Generator::next — 生成器继续执行
  Generator::rewind — 重置迭代器
  Generator::send — 向生成器中传入一个值
  Generator::throw — 向生成器中抛入一个异常
  Generator::valid — 检查迭代器是否被关闭
  Generator::__wakeup — 序列化回调
  Gengerator::getReturn - Get the return value of a generator
  摘自 php.net generator
 
  看着以上方法,是不想起了Iterator, 他们的确很像。同时注意,官网zh语言版本的文档没有索引方法getReturn,访问也是404。文档以en版为准,ch做参考。
 
  以上就是生成器所有的方法,我们一个个来看。
 
  测试方法代码 /php-yield-test/generatorMothod.php, 这里面对每个方法都有使用举例,运行结果如下。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读