The IteratorAggregate is an interface to create an external Iterator:
class myData implements IteratorAggregate
{
public $property1 = "Public property one";
public $property2 = "Public property two";
public $property3 = "Public property three";
public function __construct()
{
$this->property4 = "last property";
}
public function getIterator()
{
return new ArrayIterator($this);
}
}
$obj = new myData;
And you’ll be able to traverse the object using foreach:
foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}
While Iterator is an interface for external iterators or objects that can be iterated themselves internally:
class myIterator implements Iterator
{
private $position = 0;
private $array = array('one', 'two', 'three');
function rewind()
{
$this->position = 0;
}
function current()
{
return $this->array[$this->position];
}
function key()
{
return $this->position;
}
function next()
{
++$this->position;
}
function valid()
{
return isset($this->array[$this->position]);
}
}
And again, you can traverse it basically the same way:
$it = new myIterator;
foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
So can anyone explain why we need two interfaces and what’s the difference between them?
I assume
IteratorAggregateis for cases where you want to save time, andIteratoris for cases where you need fine control over iteration through your object. For example it lets you add custom exceptions onnext(),key()orprev()failures, caching(if you iterate through something that takes data over the network), preprocess values before returning them.