




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 没有 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() 的统一抽象 —— 这个细节常被忽略,但影响扩展性设计。