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)