У меня есть много функций, которые либо имеют хинтинг типов для массивов, либо используют is_array ()
для проверки массивности переменной.
Теперь я начинаю использовать объекты, которые можно повторять. Они реализуют Iterator
или IteratorAggregate
. Будут ли они приняты как массивы, если они пройдут через хинтинг типа или пройдут is_array ()
?
Если мне нужно изменить свой код, существует ли общий вид is_iterable ()
или я должен сделать что-то вроде:
if ( is_array($var) OR $var instance_of Iterable OR $var instanceof IteratorAggregate ) { ... }
Какие еще итерируемые интерфейсы существуют?
Я думаю, вы имеете в виду 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.
К сожалению, вы не сможете использовать для этого подсказки типов, и вам придется использовать is_array($var) или $var instanceof ArrayAccess
вещи. Это известная проблема, но она до сих пор не решена. По крайней мере, это не работает с PHP 5.3.2, который я только что протестировал.