Start · Sprachen · PHP · Referenz · IteratorAggregate

IteratorAggregate

Interface

Ermöglicht einer Klasse, einen externen Iterator bereitzustellen, sodass sie mit <code>foreach</code> durchlaufen werden kann.

seit PHP 5.0.0 Kategorie: misc

Signatur

interface IteratorAggregate extends Traversable

Beschreibung

IteratorAggregate ist ein eingebautes PHP-Interface, das Klassen erlaubt, einen externen Iterator-Objekt zurückzugeben, anstatt die Iterationslogik direkt in der Klasse zu implementieren. Im Gegensatz zu Iterator, bei dem alle Iterationsmethoden (current(), key(), next() usw.) direkt in der Klasse implementiert werden müssen, delegiert IteratorAggregate diese Aufgabe an ein separates Iterator-Objekt.

Das Interface erfordert die Implementierung genau einer Methode: getIterator(). Diese Methode gibt ein Objekt zurück, das entweder Traversable implementiert (also Iterator oder wieder IteratorAggregate), oder ab PHP 8.0 auch ein natives array. Typischerweise wird ein ArrayIterator, ArrayObject oder ein benutzerdefinierter Iterator zurückgegeben.

IteratorAggregate ist besonders dann sinnvoll, wenn eine Klasse eine interne Datensammlung (z. B. ein Array) kapselt und diese nach außen iterierbar machen soll, ohne die vollständige Iterator-Schnittstelle zu implementieren. Dies hält den Code schlanker und trennt Daten- von Iterationslogik.

  • Verwende IteratorAggregate, wenn du eine bestehende Datenstruktur einfach iterierbar machen willst.
  • Verwende Iterator, wenn du die vollständige Kontrolle über den Iterationsablauf benötigst.

Beispiele

Einfache Klasse mit IteratorAggregate

<?php
class Buecher implements IteratorAggregate
{
    private array $liste = [];

    public function hinzufuegen(string $titel): void
    {
        $this->liste[] = $titel;
    }

    public function getIterator(): ArrayIterator
    {
        return new ArrayIterator($this->liste);
    }
}

$bibliothek = new Buecher();
$bibliothek->hinzufuegen('PHP Handbuch');
$bibliothek->hinzufuegen('Clean Code');
$bibliothek->hinzufuegen('Design Patterns');

foreach ($bibliothek as $index => $titel) {
    echo $index . ': ' . $titel . PHP_EOL;
}
0: PHP Handbuch 1: Clean Code 2: Design Patterns

Gefilterte Iteration mit benutzerdefiniertem Iterator

<?php
class AktiveBenutzer implements IteratorAggregate
{
    private array $benutzer;

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

    public function getIterator(): Iterator
    {
        // Nur aktive Benutzer liefern
        $aktive = array_filter(
            $this->benutzer,
            fn(array $b) => $b['aktiv'] === true
        );
        return new ArrayIterator(array_values($aktive));
    }
}

$benutzerListe = new AktiveBenutzer([
    ['name' => 'Alice', 'aktiv' => true],
    ['name' => 'Bob',   'aktiv' => false],
    ['name' => 'Carol', 'aktiv' => true],
]);

foreach ($benutzerListe as $benutzer) {
    echo $benutzer['name'] . PHP_EOL;
}
Alice Carol

// Wichtig · Fallstricke

Rückgabetyp von getIterator(): Ab PHP 8.0 wurde der Rückgabetyp der Methode von Traversable auf Traversable|array erweitert, sodass auch ein natives PHP-Array zurückgegeben werden darf. In der Praxis empfiehlt sich jedoch stets die Rückgabe eines Iterator-Objekts für Konsistenz.

Nicht mit Iterator verwechseln: IteratorAggregate kann nicht gleichzeitig mit Iterator in derselben Klasse implementiert werden — PHP lässt dies nicht zu und wirft einen Fehler.

IteratorAggregate kann problemlos mit instanceof Traversable geprüft werden, da es dieses Interface erweitert.