生成器天然支持空迭代,无需特殊处理:遍历空数组并yield合法且不报错;yield null等值会产出对应项,与不yield语义不同;用foreach+yield可安全衔接多个数据源;应避免提前消费,推荐直接foreach感知空情况。

PHP 5.5 引入的生成器(Generator)让函数可以“暂停执行、分批返回值”,但很多人在用 yield 时,误以为必须返回非空数据,或纠结于“如何优雅处理空情况”。其实,生成器本身完全支持空迭代——无需手动判断数组是否为空再决定是否 yield,也不需要额外包装逻辑。
空数组直接 yield 不会报错,但不会产生任何值
你可以在生成器函数中遍历一个空数组并 yield 每个元素,这完全合法:
function getItems() {
$data = [];
foreach ($data as $item) {
yield $item;
}
}
调用该生成器后,得到的是一个空的 Generator 对象,foreach 遍历时不会执行任何循环体,也不会触发 warning 或 notice。它就是“什么也不产出”,行为上等价于没写 yield。
yield null / yield '' 是允许的,但语义需明确
生成器可以 yield null、空字符串、false 等任意值,PHP 不限制类型:
-
yield null;→ 迭代时会得到一个null值 -
yield '';→ 得到空字符串 -
yield [];→ 得到空数组
注意:这和“不 yield”是两回事。“不 yield”代表无迭代项;而 yield null 是产出一项值为 null 的元素。是否需要显式产出 null,取决于业务语义——比如表示“缺失值占位”,而非“无数据”。
用 yield from 实现安全的嵌套空数组衔接
PHP 7+ 支持 yield from,但它在 PHP 5.5 中不可用。不过在 5.5 中,若想“无缝衔接多个数据源(含可能为空的数组)”,可统一用 foreach + yield:
function mergeData($a, $b, $c) {
foreach ($a as $item) yield $item;
foreach ($b as $item) yield $item;
foreach ($c as $item) yield $item;
}
哪怕 $a、$b、$c 全是空数组,函数仍能正常返回 Generator,且 foreach 调用方无需做任何空值判断,代码更干净。
判断生成器是否为空?别提前消费,用 iterator_count 要谨慎
生成器是单次、惰性求值的,不能像数组一样用 count() 直接获取长度。若真需知道“有没有值”,有几种方式:
- 最稳妥:直接 foreach,靠循环是否执行来感知(推荐)
- 临时转数组:
iterator_to_array($gen, false),但会消耗整个生成器,失去内存优势 - 慎用
iterator_count():它会遍历全部并计数,副作用同上
多数场景下,应设计成“消费方不关心是否为空”,让空生成器自然结束循环即可——这才是生成器设计的本意。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











