有没有办法测试"isForEachable"的变量

Ala*_*orm 11 php foreach iterator

使用PHP,是否有一种函数/方法/方法来检查变量是否包含可以安全放入foreach构造的东西?就像是

//the simple case, would probably never use it this bluntly
function foo($things)
{
    if(isForEachable($things))
    {
        foreach($things as $thing)
        {
            $thing->doSomething();
        }
    }
    else
    {
        throw new Exception("Can't foreach over variable");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的答案是"设置一个处理程序以捕获PHP错误",那么您的努力将受到赞赏,但我正在寻找其他的东西.

Art*_*cto 15

好吧,有点.你可以做:

if (is_array($var) || ($var instanceof Traversable)) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

但是,这并不能保证foreach循环成功.它可能会抛出异常或无声地失败.原因是某些可迭代对象在某些时候可能没有任何信息可以产生(例如,它们已经被迭代,只有迭代它们才有意义).

Traversable.数组不是对象,因此不能实现这样的接口(它们先于它),但它们可以在foreach循环中遍历.

  • 请注意,对象也是可以预先访问的,因此您可能希望添加"||" is_object($ var)`到条件. (2认同)

jch*_*ook 6

PHP 7

最新版本的 PHP 有is_iterable()iterable伪类型。


PHP 5

由于所有对象和数组在 PHP 5+中都是“ foreachable ”的......

function is_foreachable($var) {
  return is_array($var) || is_object($var);
}
Run Code Online (Sandbox Code Playgroud)