首先让我们看下PHP官方文档中是怎么介绍的吧:生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。
看了这句话,我们可以获得几个关键词: 对象迭代、 Iterator 接口、性能开销 ,比较抽象,talk is cheap show me the code,下面我们从一个生成器最经典的例子开始吧。
PHP中的range() 函数在使用的时候会在内存中创建一个包含指定范围单元的数组并返回,一般来说,这个并没什么不妥,但是当所传的limit入参值很大的时候,那么也就意味着将会在内存中创建的数组也会很大,这个就太恐怖了,这是要干爆内存的节奏啊。此时我们可以通过生成器来实现一个更高效的range函数,(下面的代码是把PHP官方文档中精简处理了一下):
function xrange($start, $limit, $step = 1) { //校验参数,此处省略 for ($i = $start; $i <= $limit; $i += $step) { //向外产出值 yield $i; } } //xrange此时返回的是一个生成器对象 $gen = xrange(1, 9); //对生成器进行迭代 foreach ($gen as $number) { echo "$number "; }
这里在xrange和range函数的效果相同,均是产生了一个可迭代的变量,但是不同的是,range函数有点像ORM里面常说的 预加载 ,而xrange则是 懒加载 只是等到迭代到那个点才会产生对应的值,因此xrange并不需要分配大块内存来存放变量,大大节约了内存,提升效率。
现在我们来总结下生成器和普通函数有哪些异同:
生成器中必须包含yield关键字(用来生成结果),而且可以是多次出现,普通函数中向外部返回结果只能使用return,且函数执行完毕;
一个生成器不可以通过return返回值,这样做会产生一个编译错误PHP Fatal error: Generators cannot return values using "return"(注意:这个在PHP7下面不会出错,但是会终止生成器继续执行,即调valid()方法会返回false,然而在PHP5中return空是一个有效的语法并且它将会终止生成器继续执行)
生成器类(Generator)
Generator 对象是从生成器返回的,上面代码中$gen就是一个生成器对象。注意,生成器对象和其他类的对象不同,它并不能通过new关键字创建,只能从生成器函数获取。首先我们看下Generator类摘要来看看其组成:
Generator implements Iterator { /** * 返回当前产生的值(yield后面表达式的值) */ public mixed current ( void ) /** * yield的键(yield 'key'=>'val';) */ public mixed key ( void ) /** * 从上一个yield之后继续执行,直到下一个yield */ public void next ( void ) /** * 重置迭代器(对于生成器并没什么卵用) */ public void rewind ( void ) /** * 向生成器中传入一个值,并从上一个yield之后继续执行 */ public mixed send ( mixed $value ) /** * 向生成器中抛出一个异常,并从上一个yield之后继续执行 */ public void throw ( Exception $exception ) /** * 检查迭代器是否被关闭(false表示已关闭) */ public bool valid ( void ) /** * 序列化回调,但是生成器不能被序列化,因此会抛出一个异常 */ public void __wakeup ( void ) }
从上面的类摘要可以看出,Generator类是实现Iterator接口的,因此它具有迭代器的的特性。另外它加入了send()、throw()和__wekeup()方法,相关方法说明已经写了注释,在此不再赘述。
写了一堆,发现我的文笔不好,还是画个图感受一下吧(图画的也不美观,大家凑合着看吧,2333)
yield关键词
接下来让我们看下yield关键词,它最简单的调用形式看起来像普通函数的return,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码,并且只是暂停执行生成器函数。
这是一个典型的yield表达式:$data = yield $key => $value;,该表达式包括两部分:
注意:PHP5需要加上括号$data = (yiel<br/>d $key => $value);,否则会产生一个编译错误,PHP7就不用关心这个了
其一,是yield后面的表达式,这个可以是单个值也可以是键值对,与array中的一个元素对应,这部分表达式是返回给上层调用的,也就是上层可以通过current方法接收到值或者在执行send方法的返回值;
另外一块就是yield关键词本身,个人把他理解成一个接收器,会收到send方法传入的值,这个值就是整个yield表达式当前的值,可以被左边的变量接收。
这么说可能有点抽象,还是上图吧:
生成器委托(yield from)
PHP7新增了yield from关键词,该语法开始允许从其他的generator,Traversable对象,或者数组通过yield from 生成数函数 来yield值。yield from的各种特性与yield一样都是生成数据,只是后面跟随的表达式不同。下面看个例子(摘自PHP官方文档):
function count_to_ten() { yield 1; yield 2; yield from [3, 4]; //生成数组 yield from new ArrayIterator([5, 6]); //生成可遍历对象 yield from seven_eight(); //生成生成器对象 yield 9; yield 10; } function seven_eight() { yield 7; yield from eight(); } function eight() { yield 8; } foreach (count_to_ten() as $num) { echo "$num "; } //输出:1 2 3 4 5 6 7 8 9 10
yield from以方便我们编写比较清晰生成器嵌套,这点可以类比于函数中的嵌套调用,当函数A中调用另一个函数B,此时会等B执行完成并返回,方才继续执行。在没有yield from的时候,实现生成器嵌套需要自己实现栈并进行压栈和弹出操作以达到相同效果,那是多么痛苦的操作。
相关推荐:
以上是php生成器详细介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

Fibers在PHP8.1中引入,提升了并发处理能力。1)Fibers是一种轻量级的并发模型,类似于协程。2)它们允许开发者手动控制任务的执行流,适合处理I/O密集型任务。3)使用Fibers可以编写更高效、响应性更强的代码。

PHP社区提供了丰富的资源和支持,帮助开发者成长。1)资源包括官方文档、教程、博客和开源项目如Laravel和Symfony。2)支持可以通过StackOverflow、Reddit和Slack频道获得。3)开发动态可以通过关注RFC了解。4)融入社区可以通过积极参与、贡献代码和学习分享来实现。

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载
最流行的的开源编辑器

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。