Ward, ik bedoel dat je getIterator niet rechtstreeks moet aanroepen. De bedoeling is toch dat je dit kunt doen:
<?php
$paths = new Paths($config);
foreach($paths as $path) {
echo $path;
}
?>
Dan ga je toch niet dit doen:
<?php
$paths = new Paths($config);
$paths = $paths->getIterator();
foreach($paths as $path) {
echo $path;
}
?>
Dan gaat toch het nut van die automatische iterator verloren?
> Dan gaat toch het nut van die automatische iterator verloren?
Nee, want je kan hem alsnog als automatische iterator gebruiken. Het is niet dat doordat je hem direct aanroept, je meteen de hele automatische functionaliteit voor altijd kwijt bent.
De IteratorAggregate interface dient namelijk duidelijk maar één doel: “Interface to create an external Iterator.” Dan is het dus logisch dat deze interface maar één methode heeft: abstract public Traversable getIterator ( void ) voor het retourneren van die gecreëerde externe iterator.
>> De getIterator method wordt aangeroepen zodra je het object in een loop zet. Op die manier kun je door de class properties heen loopen.
Ja, dat klopt, maar jij gebruikt daarvoor functioneel/procedureel PHP met een foreach. Dat ziet er toch wel een ietsiepietsie anders uit dan de Iterator interface:
<?php
class Iterator extends Traversable {
/* Methods */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}
?>
Of laten we het anders omkeren: waar in die foreach gebruik je de functionaliteit van de Ieterator interface of de IteratorAggregate interface?
Ik zeg niet dat het niet mag, maar ik zeg dat het onzinnig is. Waarom zou ik eerst de iterator gaan aanroepen, terwijl ik ook direct door het object heen kan loopen zonder die method aan te roepen? Zeg jij het maar...
Als je niets kunt/wilt doen met methoden zoals next() en rewind() en alles past in een foreach, dan heb je inderdaad een punt. Dan gewoon ook de interfaces daarvoor links laten liggen, anders loop je precies aan tegen het probleem waarmee je het topic begon.
De interface IteratorAggregate kent maar één enkel voorschrift: implementeer de methode getIterator(). That's it. Niet meer, niet minder. Als je dan uitgerekend die ene methode nu juist niet ziet zitten, dan implementeer je toch gewoon de hele interface niet?
Het wordt zo haast een schizofreen vraagstuk: waarom wil je een interface implementeren die je niet wilt implementeren?