is_iterable() 是 PHP 7.1+ 判断变量是否可迭代的最简洁可靠方法,对数组、Traversable 对象及实现 __iterable 的类返回 true,对字符串、整数、null、资源、普通对象返回 false。

用 is_iterable() 判断变量是否可迭代
PHP 7.1+ 直接提供 is_iterable() 函数,这是最简洁、最可靠的方式。它返回 true 当变量是数组、Traversable 对象(如 Iterator、Generator、ArrayObject 等),或实现了 __iterable 协议的类实例。
注意:字符串、整数、null、资源、普通对象(未实现 Traversable)都返回 false。
示例:
var_dump(is_iterable([1, 2])); // true
var_dump(is_iterable(new ArrayObject())); // true
var_dump(is_iterable("hello")); // false
var_dump(is_iterable(new stdClass())); // false
兼容 PHP
老版本 PHP 没有 is_iterable(),需手动组合判断。核心逻辑是:检查是否为数组,或是否是实现了 Traversable 接口的对象。
立即学习“PHP免费学习笔记(深入)”;
-
is_array($var)覆盖原生数组 -
$var instanceof Traversable覆盖所有迭代器对象(包括Iterator、Generator、ArrayObject、SimpleXMLIterator等)
不要用 is_object($var) && method_exists($var, 'current') —— 这会漏判 Generator(它不是对象),也可能误判带 current() 方法但不可遍历的类。
推荐写法:
function is_iterable_compat($var) {
return is_array($var) || $var instanceof Traversable;
}
别把 foreach 可用性等同于可迭代
有些值在 foreach 中“看似能用”,但其实不符合可迭代语义,比如 null 或未初始化变量——它们会触发警告而非报错,但 is_iterable() 明确返回 false。
常见陷阱:
-
foreach(null as $v)触发Warning: Invalid argument supplied for foreach(),但is_iterable(null)是false -
foreach(42 as $v)同样报 Warning,is_iterable(42)也是false -
foreach($undefined as $v)触发 Notice + Warning,而is_iterable($undefined)会 Notice “undefined variable”,但函数本身不抛出异常
所以,务必先用 is_iterable() 做守门员,而不是依赖 foreach 是否静默执行。
is_iterable() 和 instanceof Traversable 的区别
is_iterable() 是语言层语义判断,覆盖数组和所有 Traversable;而 instanceof Traversable 只对对象生效,对数组返回 false。
这意味着:
- 如果你只处理对象(比如写一个接收迭代器的接口参数),用
instanceof Traversable更精准 - 如果要统一处理数组或对象(比如通用数据扁平化函数),必须用
is_iterable() - 数组不能被
cast成Traversable,也不能被yield from直接展开(需用yield from $array语法支持,但底层仍依赖is_iterable语义)
PHP 7.4+ 的 yield from 支持数组,正是基于 is_iterable() 的统一抽象 —— 这个细节常被忽略,但影响扩展性设计。











