本篇文章为大家展示了PHP中如何使用yield 关键字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
为大观等地区用户提供了全套网页设计制作服务,及大观网站建设行业解决方案。主营业务为网站制作、成都网站建设、大观网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。
生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。
我们用伪代码来举个例子:
直接遍历:
getAll(); //获取所有用户数据,返回一个大数组 ,数据越多,内存开销就越高,会严重影响性能。foreach($list as $key => $v){....//对键值进行操作,赋值等等,严重影响性能。}
这时候,我们的生成器就可以派上用场了,我们看看Generator的实现:
//Generator 实现了Iterator 接口final class Generator implements Iterator {function rewind() {} //重置生成器,如果生成器当前在第一个yield之后,则抛出异常。function valid() {} //检查,如果生成器已关闭,则返回false,否则返回true。function current() {} //返回当前产生的值function key() {} //返回当前产生的键 function next() {} //继续执行下一个function send($value) {}//设置yield表达式的返回值并恢复生成器的执行(除非生成器已经关闭)。function PS_UNRESERVE_PREFIX_throw(Throwable $exception) {} //在生成器的当前挂起点抛出异常。function getReturn() {}//返回传递给return的任何值,如果没有,则返回null。如果生成器仍然有效,则抛出异常。public function __wakeup(){} //序列化回调,在生成器不能被序列化时抛出异常。}
生成器特性简述:
1、生成器最大的优点就是迭代数据,性能开销小,简单易用。
2、yield必须有函数包裹,包裹yield的函数称为”生成器函数”,该函数将返回一个可遍历的对象
3、生成器Generator类是Iterator 的实现,但是修改了内部的逻辑。
4、生成器是暂停循环执行逻辑,等到用的时候,才会触发循环再次执行。while 不会对它造成阻塞
写一个应用场景
生成器可以返回表达式
此特性基于 PHP 5.5 版本中引入的生成器特性构建的。 它允许在生成器函数中通过使用
return
语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用Generator::getReturn()
方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次getReturn(), PHP_EOL;//返回123在生成器中能够返回最终的值是一个非常便利的特性, 因为它使得调用生成器的客户端代码可以直接得到生成器(或者其他协同计算)的返回值, 相对于之前版本中客户端代码必须先检查生成器是否产生了最终的值然后再进行响应处理 来得方便多了。
Generator delegation
现在,只需在最外层生成其中使用
yield from
, 就可以把一个生成器自动委派给其他的生成器, Traversable 对象或者 array。//返回上述内容就是PHP中如何使用yield 关键字,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。
分享文章:PHP中如何使用yield关键字
标题链接:http://cdxtjz.cn/article/ghepoh.html