Ola peeps,

Ik heb in een class een getIterator method omdat die class de IteratorAggregate interface implementeert.

Nu wil ik in het commentaar van die method erbij schrijven dat ik die method niet "rechtstreeks" moet aanroepen. Wat is dan de juiste vertaling?

Ik dacht aan:

Do not call this method directly.

of

Do not call this method manually.

Is een van deze beide opties correct? Of weten jullie wellicht iets beters?
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.
>> Het is niet dat doordat je hem direct aanroept, je meteen de hele automatische functionaliteit voor altijd kwijt bent.

Dat zeg ik ook niet... maar mijn vraag is, waarom zou je die iterator afzonderlijk aanroepen terwijl je gebwoon het object kunt loopen? Wat mis ik?
Verwar je de IteratorAggregate interface niet met de Iterator interface?

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.
>> Verwar je de IteratorAggregate interface niet met de Iterator interface?

Nee, volgens mij niet. Ik heb dat ooit van Wouter geleerd volgens mij.

De getIterator method wordt aangeroepen zodra je het object in een loop zet. Op die manier kun je door de class properties heen loopen.
>> 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 snap niet helemaal wat je bedoelt Ward.

Ik wil door mijn class properties heen kunnen loopen.

Voor de IteratorAggregate heb je die methods die jij hierboven zet helemaal niet nodig. Alleen de getIterator method:

<?php

class SomeData implements IteratorAggregate {

private $data;

public function __construct($data) {
$this->data = $data;
}

public funcion getIterator() {
return new \ArrayIterator($this->data);
}

}

$data = new SomeData($data);
foreach ($data as $key => $value) {
// doe iets met key en value
}

?>
Snap je?
En waarom mag de enige methode getIterator() van de IteratorAggregate interface dan niet worden aangeroepen?
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?

Reageren