PHPyield协程生成器用法的了解

写在前面

这篇文章,要和大家探讨的是 PHP yield 在 生成器用法,不带foreachfor,while循环的那种。就讨论yield将一个函数变成为生成器的用法。

泾川网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。

关于yield特性,是在开发PHP5时被提上日程,PHP5.5版本正式加入。

关于yield的使用,我看到大部分文章都停留在,使用yield如何在foreach中穿出数据,今天想给大家讲讲 生成器 所有语法。

官网讲解

生成器允许你在foreach代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要yield多次,以便生成需要迭代的值。

看了下官网对他讲解:php.net 生成器语法 . 每个字都认识,但似乎还是体会到它讲的内涵。官网我们主要看两部分内容:

yield的语法。

代码例子。

先说语法, yield 的左边是一个赋值语句,右边可以是值(也可是表达式) 。而yield 会先执行右边的表达式,并把值$value送到生成器外面。当生成器收到值后,会执行yield左边的语句,赋值给$data.

语法就这样,估计大家还是有些懵,那就看看官网下面代码例子吧,我看里面例子参差不齐。

注意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,用来检查哪些函数能构成生成器,哪些不能。运行结果如下

函数内必须有yield关键词,函数可以是全剧函数,或者类的方法。哪怕yield肯定不会被执行,也会产生生成器。见:yield_func4光秃秃 的yield关键词就行(不向外送出,不处理外面的输入)。见: yield_func2函数内使用 生成器 并不能让自己也成为生成器,见:yield_func5eval函数中直接运行yield会报错, 见:yield_func11

是的,函数内有没有foreach,while,for 语句都不是关键,关键是 yield. 生成器的类型判断用$gen instanceof Generator

生成器的函数

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做参考。


文章名称:PHPyield协程生成器用法的了解
网站链接:http://scyanting.com/article/chogih.html