PHP——yield小记

229 阅读1分钟

第一次知道yield是在Python代码中,当时并不知道yield的真正用途。 真正开始研究yield是为了解决大文件的导入导出。之前这种导入导出操作使用的都是maatwebsite/excel扩展包,但当文件过大的时候,就会出现超时错误,虽然该扩展包样式,功能都非常强大,但是对内存的需求过高,所以结合项目需要我们最终选择了rap2hpoutre/fast-excel配合yield实现大文件的导入导出

生成器概念(PHP文档)

生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。 生成器允许你在 foreach代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield多次,以便生成需要迭代的值。

生成器的使用方法

public function testYield($nums) {
    foreach($nums as $num) {
        yield $num;
    }
}

public function index()
{
    foreach($this->testYield([1,2,4,5]) as $num) {
        dump($num);
    }
    die();
}

效果图

image.png

注意点

yield不同于return,普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数

以上是我的个人理解,如有误还请大神不吝赐教,ღ( ´・ᴗ・` )笔芯