PHP5.5或将引入Generators

PHP5.5计划引入生成器特性,这是一种可以返回迭代器的函数,允许开发者在处理大量数据时按需生成数据,而不是一次性加载所有数据到内存中。此特性将简化迭代过程并提高内存效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP5.5或将引入Generators


最早的时候, 我记得是去年我刚加入开发组的时候, 神仙同学曾经提过, 问我是否可以考虑为PHP实现yield. 我当时做过尝试, 但是最后发现需要大改zend executor, 而当时的我还没有那么大的魄力(因为我记得当时我的第一个RFC刚刚被拒绝)认为我能说服那么多人接受这个变动, 所以后来就不了了之了.

但, 现在Nikita Popov, 完整的实现了这个RFC: Generators, 并且已经提供了一个可用的实现, 目前这个RFC在投票阶段, 投票形式也比较乐观, 所以如果不出大问题, PHP5.5将会引入这一新特性.

我就这里为大家简单介绍下, 这个新特性.

所谓Generators, 我们以下称为”生成器”, 是一种可以返回迭代器的生成器. 呵呵, 这话有点绕, 让我们看看一个代码, 在没有迭代器之前, 如果我们遍历一个动态生成的数组:

  1. <?php
  2. function return_array() {
  3. $array = dummy(); //计算全部数组内容
  4. return $array;
  5. }
  6.  
  7. foreach (return_array() as $v) {
  8. }

这里就有一个问题, 我们需要一次性生成全部数组内容, 并且返回, 想象一下如果数据来源非常大, 我们无法一次性读入内存.

当然, 我们可以采用一个类, 封装一个支持迭代的实现:

  1. <?php
  2. class dummy implements Iterator {
  3. public function rewind() {
  4. //实现代码
  5. }
  6. public function valid() {
  7. //实现代码
  8. }
  9. public function current() {
  10. //实现代码
  11. }
  12. public function key() {
  13. //实现代码
  14. }
  15. public function next() {
  16. //实现代码
  17. }
  18. }
  19.  
  20. foreach (new Dummy() as $v) {
  21. }

相比这种实现, 生成器提供了一种更加简便的选择, 比如实现如上同样的功能:

  1. <?php
  2. function genrators() {
  3. while ($i = dummy_line()) //生成数组的一个元素
  4. {
  5. yield $i;
  6. }
  7. }
  8.  
  9. foreach (generators() as $v) {
  10.  
  11. }

也就是说, 每当产生一个数组元素, 就通过yield关键字返回成一个, 并且函数执行暂停, 当返回的迭代器的next方法被调用的时候, 会恢复刚才函数的执行, 从上一次被yield暂停的位置开始继续执行, 到下一次遇到yield的时候, 再次返回.

好了, 这就是个简单的介绍, 如果大家有兴趣, 可以搜索一下其他已经实现了Generators语言的相关介绍.

呵呵, 大家觉得这个新特性怎么样呢?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值