iterable 是 PHP 7.1+ 的伪类型,本质为 array|Traversable 联合类型,仅用于类型声明,不可实例化或实现;支持 foreach 和 yield from,校验需用 is_iterable()。

iterable 是 PHP 7.1+ 的伪类型,不是类也不是接口
它只在类型声明(参数、返回值、属性)中起作用,运行时不存在 iterable 这个真实类型。它的本质是联合类型:等价于 array|Traversable。也就是说,只要传进来的是数组,或者实现了 Traversable 接口的对象(比如 Iterator、Generator、ArrayObject),就满足约束。
为什么不能 new iterable() 或写 class X implements iterable
iterable 不是接口,不能被实现;也不是类,不能被实例化。常见误解是把它当接口用——但 PHP 中真正可被实现的是 Iterator 或 IteratorAggregate,而 iterable 只是“告诉函数:我接受这两类东西”。如果你看到 class Foo implements iterable,那会直接报错:Fatal error: Cannot implement interface iterable。
foreach 能用 iterable,但 is_iterable() 才是真校验
foreach 内部自动识别数组和 Traversable 对象,所以只要变量满足 iterable 约束,就能遍历。但如果你想在逻辑分支里提前判断,必须用 is_iterable():
function process(iterable $data) {
if (!is_iterable($data)) {
throw new InvalidArgumentException('Expected iterable');
}
foreach ($data as $item) { /* ... */ }
}-
is_iterable(null)→false -
is_iterable(new stdClass())→false -
is_iterable([1,2])→true -
is_iterable(new ArrayObject([1,2]))→true
类型声明中 iterable 和 array|Traversable 的区别
表面上看,iterable 就是 array|Traversable 的语法糖,但关键差异在静态分析和 IDE 支持上:
立即学习“PHP免费学习笔记(深入)”;
- PHPStan/ Psalm 把
iterable当作统一抽象,能推导出foreach中的元素类型(比如iterable<string></string>) - 直接写
array|Traversable时,工具可能无法准确推断内部元素类型,尤其对自定义Iterator类 - PHP 8.0+ 支持泛型式写法:
iterable<int></int>,但array<int>|Traversable</int>不合法
实际编码中,只要没用到泛型推导,二者行为一致;但一旦涉及 IDE 补全或类型检查工具,iterable 更可靠。



















