I have a lot of functions that either have type hinting for arrays or use is_array()
to check the array-ness of a variable.
Now I'm starting to use objects that are iterable. They implement Iterator
or IteratorAggregate
. Will these be accepted as arrays if they pass through type hinting, or undergo is_array()
?
If I have to modify my code, is there a generic sort of is_iterable()
, or must I do something like:
if ( is_array($var) OR $var instance_of Iterable OR $var instanceof IteratorAggregate ) { ... }
What other iterable interfaces are out there?
I think you mean instanceof
Iterator
, PHP doesn't have anIterable
interface. It does have aTraversable
interface though.Iterator
andIteratorAggregate
both extendTraversable
(and AFAIK they are the only ones to do so).But no, objects implementing
Traversable
won't pass theis_array()
check, nor there is a built-inis_iterable()
function. A check you could use isTo be clear, all php objects can be iterated with foreach, but only some of them implement
Traversable
. The presentedis_iterable
function will therefore not detect all things that foreach can handle.