php匿名对象(我们身边的现代PHP(三))PHP函数 / PHP匿名函数使用方法...

wufei123 发布于 2024-02-18 阅读(93)

生成器PHP生成器(generator)是PHP5.5.0引入的功能,我估计很多小伙伴都没用过,甚至不知道生成器这个特性的存在,因为生成器的作用不是很明显生成器是简单点迭代器,仅此而已与标准的PHP迭代器不同,PHP生成器不要求类实现。

Itereaor(不知道这个是什么?看补充迭代器部分)接口,从而减轻了类的负担假如标准的PHP迭代器经常在内存中执行迭代操作,这要预先计算出数据集,性能低下;如果使用特定的方式计算大量数据,对性能的影响更甚。

php匿名对象(我们身边的现代PHP(三))PHP函数 / PHP匿名函数使用方法...

此时我们可以使用生成器,及时计算并产出后续值,不占用宝贵的内存资源简单补充迭代器很多小伙伴不知道迭代器是什么,也就是Itereaor接口是什么PHP官方简介:可在内部迭代自己的外部迭代器或类的接口(太抽象,看不懂?)。

个人理解:高级foreach循环,能够让对象像数组一样循环其实foreach也能循环对象,区别在于:如果你的类并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT。

对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach,而对于ZEND_ITER_OBJECT的类对象,则会通过调用对象实现的Iterator接口相关函数来进行foreach。

看不懂没关系,基本你也不会去用,哈哈哈,这里只是想说明一个问题,不管你使用foreach还是自己创建的迭代器,你要循环的数据是预先生成的,这个数据会加载到内存,提供给迭代器循环输出,那么这个数据如果超过最大内容限制,会提示内存不足,当然你可以使用 ini_set(memory_limit, 内存大小);来临时改变内存,但是如果还是不够怎么办,例如:我现在有个日志文件,大小是5G,服务器的内存2G,你全开都不够啊,哈哈哈哈哈,怎么办呢?生成器就能给我解决这个问题,哈哈哈,大部分我使用生成器也是读文件在用。

注意:PHP生成器不能满足所有迭代操作的需求,因为如果不查询,生成器永远不知道下一个要迭代的值是什么,这里提到一个开发中常遇到的问题来举例:数据库操作,有时候对大批量数据进行处理,如果把数据全部查询出来,很多小伙伴会遇到内存溢出,那么多数据保存在内存中,肯定不足啊,这里的解决方案就是分块拿,每次拿1000,用完再拿1000,这个解决方案在各个框架都有,例如laravel中等chunk(),tp5中也是chunk(),分块拿,小伙伴可以定位到这个chunk(),里面是do{}while{}循环在处理,那么问题来了,能否用今天我们探究的生成器来解决呢?答案是no,至于为什么,因为生成器永远不知道下一个要迭代的值是什么,这里对数据库的操作,我们只能采取数据拿出才能解决,难道你打算每次读取一条,那么这样数据库资源更大,不建议。

创建生成器生成器的创建很简单,只是一个PHP函数,使用yield关键字与普通的PHP函数不同的是,生成器从不返回值,只产出值,和return是有区别的

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻99653