问题 有没有办法测试“isForEachable”的变量


使用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");
    }
}

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


8260
2017-08-30 03:58


起源

有关: stackoverflow.com/questions/3584700/... - quantumSoup


答案:


好吧,有点。你可以做:

if (is_array($var) || ($var instanceof Traversable)) {
    //...
}

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

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


15
2017-08-30 04:00



例如DOMNodeList也是一个具有自己的方法的对象,但奇怪的是它的foreach兼容和它的!is_array(...)。 - thevikas
请注意,对象也可以预先连接,因此您可能希望添加 || is_object($var) 有条件的。 - jchook


PHP 7

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


PHP 5

因为所有对象和数组都是“foreachable“在PHP 5 + ...

function is_foreachable($var) {
  return is_array($var) || is_object($var);
}

2
2017-08-19 02:37





检查使用 is_array 

if( is_array($things) )
      echo "it is foreachable";
else
      echo "Not it's not foreachable.";

-2
2017-08-30 03:59



你也可以预告对象 - Galen
该 foreach loop支持的不仅仅是数组。 - Artefacto
谢谢你清理它。道歉,我的坏。我不太使用PHP OOP。 - shamittomar