我有一个方法可以接收可以是多种类型的参数。
它可能是一个数组。
它可能是某种可迭代的对象,例如集合。
也可能是其他东西,例如会抛出的字符串或整数
Warning: Invalid argument supplied for foreach()
如何可靠地检查变量是否“可循环”以避免警告?
我已经按照以下方式尝试过is_array()
,但这仅适用于数组:
if(is_array($mystery_type)){
foreach($mystery_type as $value){
...
}
}
我很惊讶没有在这里找到答案,这可能意味着它很简单,而且我遗漏了一些明显的东西。
答案 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会触发错误。