Signatur
Beschreibung
EmptyIterator implementiert das Iterator-Interface und repräsentiert eine leere Sequenz ohne Elemente. Alle Methoden des Interfaces sind implementiert, geben jedoch neutrale oder leere Werte zurück bzw. werfen eine NoRewindableIterator-kompatible Ausnahme bei ungültigem Zugriff.
Die Klasse ist besonders im Kontext des Null-Objekt-Musters (Null Object Pattern) nützlich: Anstatt an Stellen, die einen Iterator erwarten, null zurückzugeben oder auf null zu prüfen, liefert man einfach einen EmptyIterator. Der aufrufende Code kann dann ohne zusätzliche Prüfung mit dem Iterator arbeiten, ohne dass Fehler auftreten.
Ein typischer Anwendungsfall ist das Rückgeben eines leeren Iterators aus einer Methode, wenn keine Ergebnisse vorhanden sind – beispielsweise bei einer Datenbankabfrage ohne Treffer, statt ein leeres Array zu verwenden oder null zurückzugeben.
EmptyIterator ist Teil der Standard PHP Library (SPL) und erfordert keine zusätzliche Extension.
Beispiele
Grundlegende Verwendung als leerer Iterator
<?php
$iterator = new EmptyIterator();
foreach ($iterator as $key => $value) {
// Diese Schleife wird niemals ausgeführt
echo "Schlüssel: $key, Wert: $value\n";
}
echo "Schleife abgeschlossen. Keine Elemente vorhanden.";
Null-Objekt-Muster: Methode gibt leeren Iterator zurück
<?php
function getResults(array $data): Iterator
{
if (empty($data)) {
// Statt null zurückzugeben, liefern wir einen EmptyIterator
return new EmptyIterator();
}
return new ArrayIterator($data);
}
// Aufruf mit leeren Daten
$results = getResults([]);
foreach ($results as $item) {
echo $item . "\n";
}
echo "Fertig – keine null-Prüfung nötig.\n";
// Aufruf mit Daten
$results = getResults(['Apfel', 'Banane', 'Kirsche']);
foreach ($results as $item) {
echo $item . "\n";
}
Verwendung in Kombination mit AppendIterator
<?php
// EmptyIterator als Platzhalter in zusammengesetzten Iteratoren
$append = new AppendIterator();
$append->append(new EmptyIterator());
$append->append(new ArrayIterator([1, 2, 3]));
$append->append(new EmptyIterator());
foreach ($append as $value) {
echo $value . "\n";
}
// Wichtig · Fallstricke
Zugriff auf ungültige Methoden: Der Aufruf von current() oder key() auf einem EmptyIterator wirft eine \Exception, da es keine Elemente gibt. Dies passiert jedoch nicht beim normalen Einsatz in einer foreach-Schleife, da valid() sofort false zurückgibt und die Iteration gar nicht erst beginnt.
Unterschied zu ArrayIterator([]): Funktional ähnlich, aber EmptyIterator ist semantisch klarer und hat keinen internen Array-Overhead. Für Fälle, in denen explizit ein leerer Iterator als Null-Objekt benötigt wird, ist EmptyIterator die bessere Wahl.