The
Iterable Type
What do arrays, generators, and iterators have in common? You can
iterate over their elements. The iterable super-type
allows for type declarations that accept an array as
well as implementations of the Traversable interface
such as generators (functions or methods that use the
yield statement) and iterators (classes that implement
the Iterator interface).
The example below shows that a function that expects a parameter
of type iterable accepts an array:
function f(iterable $elements)
{
foreach ($elements as $element) {
var_dump($element);
}
}
f([0, 1, 2]);
Executing the code shown above will print the output shown below:
int(0)
int(1)
int(2)
The example below shows that a function that expects a parameter
of type iterable accepts a generator:
function g()
{
yield 0;
yield 1;
yield 2;
}
function f(iterable $elements)
{
foreach ($elements as $element) {
var_dump($element);
}
}
f(g());
Executing the code shown above will print the output shown below:
int(0)
int(1)
int(2)
The example below shows that a function that expects a parameter
of type iterable accepts an object that implements the
Iterator interface:
class MyIterator implements Iterator
{
private $elements = [0, 1, 2];
private $position;
public function rewind()
{
$this->position = 0;
}
public function valid()
{
return $this->position < count($this->elements);
}
public function key()
{
return $this->position;
}
public function current()
{
return $this->elements[$this->position];
}
public function next()
{
$this->position++;
}
}
function f(iterable $elements)
{
foreach ($elements as $element) {
var_dump($element);
}
}
f(new MyIterator);
Executing the code shown above will print the output shown below:
int(0)
int(1)
int(2)