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 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步