Как определить, является ли объект Traversable в PHP?

Как я могу определить, что переменная является объектом Traversable для использования в циклах foreach?

if(is_traversable($variable)) {
    return (array) $variable;
}

person Milad Rahimi    schedule 29.07.2015    source источник


Ответы (2)


Используйте instanceof, чтобы определить, является ли объект Traversable

if($variable instanceof \Traversable) {
  // is Traversable
}
person John Conde    schedule 29.07.2015
comment
Небольшое примечание, чтобы добавить, что если этот код не находится в глобальном пространстве имен, он будет оценен как false, если только Traversable не будет импортирован или полностью квалифицирован, поэтому OP должен добавить use Traversable; или использовать \Traversable в свой код. - person Darragh Enright; 29.07.2015
comment
Следует отметить, как упоминалось в комментариях на странице Traversable phpdoc, что объекты и массивы можно перебирать с помощью чего-то вроде foreach, но они НЕ являются экземплярами Traversable. - person Scott; 02.03.2016

is_iterable можно использовать, начиная с PHP 7.1.

// https://wiki.php.net/rfc/iterable
var_dump(
    true === is_iterable([1, 2, 3]),
    true === is_iterable(new ArrayIterator([1, 2, 3])),
    true === is_iterable((function () { yield 1; })())
);
person masakielastic    schedule 29.08.2016
comment
Я предполагаю, что проходимая проверка должна убедиться, что условия, перечисленные на stackoverflow.com/a/6251125/859837, выполнены. Не слишком уверен, но is_iterable может дать вам ложное срабатывание, потому что массивы повторяемы, но не проходимы. - person Francisco Luz; 15.07.2018