php yield 关键词使用 生成器

一懒众衫小,薪尽自然凉。

 

生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低

看到这个词 yield, 相信很多人都比较陌生,也许在其他语言中看到的比在php中看到的更多,代表的是yield 生成器修饰词;

直接上代码看实现的功能

function xrange($start, $limit, $step = 1) {
    if ($start <= $limit) {
        if ($step <= 0) {
            throw new LogicException('Step must be positive');
        }

        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    } else {
        if ($step >= 0) {
            throw new LogicException('Step must be negative');
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}

该函数和 range 函数功能是一样的,看起来没有啥差别,但是随机的数据很大的话,差别就显示出来了

你可以试试代码进行测试一下,就知道了

 

https://www.php.net/manual/zh/language.generators.overview.php

 

官网手册上有对应的例子,可以对比一下,执行时间,内存占用等等,相对的消耗的内存比较小

 

那么一般在什么样的情况下使用呢

 

 1 function myRange($length) {
 2     $dataSet = [];
 3     for ($i=0; $i<$length; $i++) {
 4         $dataSet[] = $i;
 5     }
 6     return $dataSet;
 7 }
 8 
 9 $data = myRange(1000000);
10 foreach ($data as $i) {
11     echo $i . PHP_EOL;
12 }

 

直接运行的话,就超级耗内存

 

如果修改一下对应的代码的话,使用生成器,结果就大大不一样了

1 function myRange($length) {
2     for ($i=0; $i<$length; $i++) {
3         yield $i;
4     }
5 }
6 
7 foreach (myRange(1000000) as $i) {
8     echo $i . PHP_EOL;
9 }

 

 

 

 

posted @ 2021-07-22 08:57  方达达  阅读(38)  评论(0编辑  收藏  举报