Итерируемые объекты и подсказки типа массива?

У меня есть много функций, которые либо имеют хинтинг типов для массивов, либо используют is_array () для проверки массивности переменной.

Теперь я начинаю использовать объекты, которые можно повторять. Они реализуют Iterator или IteratorAggregate . Будут ли они приняты как массивы, если они пройдут через хинтинг типа или пройдут is_array () ?

Если мне нужно изменить свой код, существует ли общий вид is_iterable () или я должен сделать что-то вроде:

if ( is_array($var) OR $var instance_of Iterable OR $var instanceof IteratorAggregate ) { ... }

Какие еще итерируемые интерфейсы существуют?

53
задан Benjamin 2 July 2012 в 02:05
поделиться

2 ответа

Я думаю, вы имеете в виду instanceof Iterator, PHP не имеет интерфейса Iterable.Однако у него есть Traversable интерфейс. Iterator и IteratorAggregate расширяют Traversable (и, насколько мне известно, они единственные, кто это делает).

Но нет, объекты, реализующие Traversable, не пройдут проверку is_array(), и нет встроенной функции is_iterable(). Можно использовать следующую проверку:

function is_iterable($var) {
    return (is_array($var) || $var instanceof Traversable);
}

Для ясности, все php-объекты могут быть пройдены с помощью foreach, но только некоторые из них реализуют Traversable. Таким образом, представленная функция is_iterable не обнаружит все, что может обработать foreach.

75
ответ дан 7 November 2019 в 08:31
поделиться

К сожалению, вы не сможете использовать для этого подсказки типов, и вам придется использовать is_array($var) или $var instanceof ArrayAccess вещи. Это известная проблема, но она до сих пор не решена. По крайней мере, это не работает с PHP 5.3.2, который я только что протестировал.

1
ответ дан 7 November 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: