如何在PHP中检测对象是否可遍历?

11

如何检测变量是否为Traversable对象以在foreach循环中使用?

if(is_traversable($variable)) {
    return (array) $variable;
}
2个回答

16

is_iterable 可以在 PHP 7.1 及以上版本中使用。

// https://wiki.php.net/rfc/iterable
var_dump(
    true === is_iterable([1, 2, 3]),
    true === is_iterable(new ArrayIterator([1, 2, 3])),
    true === is_iterable((function () { yield 1; })())
);

我认为可遍历性检查是为了确保满足 https://dev59.com/p2025IYBdhLWcg3wCxVN#6251125 中列出的条件。不太确定,但 is_iterable 可能会给你一个错误的结果,因为数组是可迭代的但不可遍历。 - Francisco Luz

14

使用 instanceof 来判断对象是否为 Traversable

if($variable instanceof \Traversable) {
  // is Traversable
}

6
顺便提一下,如果这段代码不在全局命名空间中,它将会被解析为 false,除非导入或完全限定 Traversable 接口,因此 OP 应该在他们的代码中添加 use Traversable; 或使用 \Traversable - Darragh Enright
4
需要注意的是,在Traversable phpdoc页面的评论中提到,可以使用类似于foreach的方法来遍历对象和数组,但它们并不是Traversable的实例。 - Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接