如何检查变量是否“可循环”?

时间:2018-06-26 09:15:48

标签: php

我有一个方法可以接收可以是多种类型的参数。

它可能是一个数组。

它可能是某种可迭代的对象,例如集合。

也可能是其他东西,例如会抛出的字符串或整数

Warning: Invalid argument supplied for foreach()

如何可靠地检查变量是否“可循环”以避免警告?

我已经按照以下方式尝试过is_array(),但这仅适用于数组:

if(is_array($mystery_type)){
    foreach($mystery_type as $value){
        ...
    }
}

我很惊讶没有在这里找到答案,这可能意味着它很简单,而且我遗漏了一些明显的东西。

2 个答案:

答案 0 :(得分:4)

如果您使用的是 PHP 7.1 + ,则可以使用is_iterable()

if (is_iterable($mystery_type)) {
    // your loop
}

或其 polyfill (位于documentation comments中):

if (!function_exists('is_iterable')) {
    function is_iterable($obj) {
        return is_array($obj) || (is_object($obj) && ($obj instanceof \Traversable));
    }
}

阅读更多iterable伪类型(PHP 7.1 +)

答案 1 :(得分:2)

最好的方法是不编写接受多种数据类型作为输入的方法,而是为每种类型的输入编写较小的特定方法。这种较小方法的代码更短,更简单,更易于阅读和理解(以及测试)。

用于可迭代数据结构的方法应使用Traversable接口作为其参数的类型:

public function f(Traversable $input) {
    // This foreach is guaranteed to always work
    foreach ($input as $key => $value) {
        // Do something with $value and/or $key
    }
}

当调用方法f()的值未实现Traversable时,PHP会触发错误。