php 生成器作用,php 生成器的理解和使用

6f1aeaa4c8dc

image.png

开头介绍的这个文章总结的很详细,而且大多的介绍其实都是这么写的,也是这些例子。但是手册的介绍也很重要。此处,我主要写一些个人的理解要点

1.生成其是一种更容易实现简单对象迭代。所以他的本质其实是相当于有助于更好的实现 foreach 等方式的迭代

系能和复杂性大大降低

3.生成器允许你在 foreach 代码块中写迭代一组数据,而不需要在内容中创建一个数组。(正常来说我们都是遍历后赋值给一个变量,但生成器允许你直接使用 yield 接受变量,并最终返回)

4.生成器可以根据需求,对此执行 yield

1.要知道 yield 的使用是实现了 Iterator(迭代器)接口,而这个接口是有相应的方法的,最主要的是它是一步步执行的,一次循环后才能执行下一个。其实这种情况有点像队列,所以适合使用与处理大文件的读取或者大的数据的处理。但是变量的情况就是直接赋值在一个内存里面。

2.还有就是 yield 其实相当于给一个返回的变量赋值,当所有的 yield 执行完毕后,将所有的值全部返回

3.yiled 的写法必须用在函数里面,不可以单独的直接使用。

**Iterator** extends **Traversable** {

/* 方法 */

abstract public [current](http://php.net/manual/zh/iterator.current.php) ( void ) : [mixed](http://php.net/manual/zh/language.pseudo-types.php#language.types.mixed)

abstract public [key](http://php.net/manual/zh/iterator.key.php) ( void ) : scalar

abstract public [next](http://php.net/manual/zh/iterator.next.php) ( void ) : void

abstract public [rewind](http://php.net/manual/zh/iterator.rewind.php) ( void ) : void

abstract public [valid](http://php.net/manual/zh/iterator.valid.php) ( void ) : bool

}

demo.php

function createRage($num = 10)

{

for ($i = 0; $i < $num; $i++) {

yield time();

}

}

foreach (createRage(10) as $item) {

sleep(1);

echo $item.'
';

}

6f1aeaa4c8dc

image.png

yield.php

$start = microtime(true);

function createRage($num = 10)

{

for ($i = 0; $i < $num; $i++) {

yield time();

}

}

foreach (createRage(10000000) as $item) {

echo PHP_EOL;

}

echo memory_get_usage(); //393088

echo '
';

echo microtime(true)-$start; // 结果 6.6504390239716

foreach.php

$start = microtime(true);

function createRage($num = 10)

{

$data = [];

for ($i = 0; $i < $num; $i++) {

$data[] = time();

}

return $data;

}

foreach (createRage(10000000) as $item) {

echo PHP_EOL;

}

echo memory_get_usage();

echo '
';

echo microtime(true)-$start;

6f1aeaa4c8dc

image.png

如果数据小一点,我拿 1000000 十万的数据测试,发现使用 yield 是可以快2s左右。已经是一个很大的差距了

6f1aeaa4c8dc

image.png

注意 生成器生成的结果是一个生成器对象,可以通过 foreach 遍历获取所有的数据,但是不能够直接像一个数组一样的对待他

6f1aeaa4c8dc

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值