Есть ли способ проверить переменную для "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", ваши усилия будут оценены, но я ищу что-то еще.

Ответ 1

Ну, вроде. Вы можете сделать:

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

Однако это не гарантирует, что цикл foreach будет успешным. Это может вызвать исключение или сбой молча. Причина в том, что некоторые итерируемые объекты в какой-то момент могут не иметь какой-либо информации (например, они уже были итерации, и имеет смысл только повторить их один раз).

См. Traversable. Массивы не являются объектами и, следовательно, не могут реализовать такой интерфейс (они предшествуют ему), но они могут быть пройдены в цикле foreach.

Ответ 2

Поскольку все объекты и массивы " foreachable" в PHP 5 +...

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

Ответ 3

Проверить с помощью is_array

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