关于 PHP 迭代生成器
什么是迭代生成器, 这个在这里就不多讲了,因为 PHP 核心开发者之一的鸟哥已经写了一篇不错的解释文章:
这里就不再多说基础理论,只记录一个经典的迭代生成器应用场景。
场景
平时用 PHP 处理数据的时间,经常用 ORM 查询一批数据来处理, 类似:
Users::all();
如果 Users 表里的数据量小还好, 但是,如果很大的话很容易造成内存溢出。
那怎么样优雅高效的实现功能呢?答案就是迭代生成器。
改进方案
<?PHP
class A {
protected function getUsers($count){
for ($i = 1; $i <= $count; $i++){
yield Users::where('id', $i)->first();
}
}
public function dealUser(){
$count = Users::count()
foreach ($this->getUsers($count) as $value){
$value->username;
// other code ....
}
}
}
因为迭代生成器的特性, 一次只加载了 1 条数据,完美的解决了内存溢出的问题,并且代码改动量非常小。
tip:
这样处理会增加数据库的查询链接时间(因为每次都查 1 条数据),是典型的时间换空间的案例。
总结
上面只是一个简单的例子,希望可以抛砖引玉,应用到更多的场景。
另外, PHP 7 支持 迭代生成器委托 这个新特性 (见 7.0 新特性:生成器委托)。