Start · Sprachen · PHP · Referenz · CachingIterator

CachingIterator

Klasse

Wrapper-Iterator, der den aktuellen und den nächsten Wert eines inneren Iterators zwischenspeichert und damit u. a. Lookahead-Operationen und <code>hasNext()</code> ermöglicht.

seit PHP 5.0.0 Kategorie: oop

Signatur

class CachingIterator extends IteratorIterator implements OuterIterator, ArrayAccess, Countable, Stringable

Beschreibung

CachingIterator umhüllt einen beliebigen Iterator und hält dessen aktuellen Element im Cache, sodass man jederzeit auf current(), key() und den String-Wert zugreifen kann. Darüber hinaus bietet er die Methode hasNext(), mit der geprüft werden kann, ob noch weitere Elemente folgen – etwas, das ein normaler Iterator nicht unterstützt.

Über Flags lässt sich das Verhalten steuern: CachingIterator::CALL_TOSTRING ruft automatisch __toString() auf jedem Element auf und speichert das Ergebnis; CachingIterator::FULL_CACHE legt alle bereits iterierten Elemente in einem internen Cache ab, der dann über das ArrayAccess-Interface oder getCache() zugänglich ist. Mit Countable kann bei aktivem FULL_CACHE die Anzahl gecachter Elemente abgefragt werden.

Typische Einsatzgebiete sind Template-Engines, bei denen man zwischen dem letzten und anderen Elementen unterscheiden möchte (z. B. für Trennzeichen), sowie jegliche Situation, in der ein Lookahead ohne erneutes Durchlaufen des Iterators benötigt wird.

Wichtig: FULL_CACHE kann bei sehr großen Datenmengen zu erhöhtem Speicherverbrauch führen, da alle Elemente im Speicher gehalten werden. Für einfache Lookahead-Zwecke reicht meist das Standard-Flag ohne FULL_CACHE.

Parameter

Name Typ Default Beschreibung
$iterator Pflicht Iterator Der innere Iterator, dessen Elemente gecacht werden sollen.
$flags int CachingIterator::CALL_TOSTRING Bitmaske aus den Klassenkonstanten, z. B. CachingIterator::FULL_CACHE, CachingIterator::CALL_TOSTRING, CachingIterator::TOSTRING_USE_KEY, CachingIterator::TOSTRING_USE_CURRENT oder CachingIterator::CATCH_GET_CHILD.

Rückgabewert

Typ

Beispiele

Letztes Element erkennen mit hasNext()

<?php
$data = new ArrayIterator(['Apfel', 'Banane', 'Kirsche']);
$cache = new CachingIterator($data);

foreach ($cache as $item) {
    echo $item;
    if ($cache->hasNext()) {
        echo ', ';
    }
}
// Ausgabe: Apfel, Banane, Kirsche
Apfel, Banane, Kirsche

FULL_CACHE: Elemente nach Iteration erneut abrufen

<?php
$data = new ArrayIterator(['rot', 'grün', 'blau']);
$cache = new CachingIterator($data, CachingIterator::FULL_CACHE);

// Einmal durchiterieren, um den Cache zu befüllen
foreach ($cache as $farbe) {
    // normales Verarbeiten
}

// Danach per ArrayAccess auf gecachte Elemente zugreifen
echo $cache[0]; // rot
echo $cache[1]; // grün
echo count($cache); // 3

// Kompletten Cache als Array holen
$arr = $cache->getCache();
print_r($arr);
rotgrün3 Array ( [0] => rot [1] => grün [2] => blau )

TOSTRING_USE_CURRENT für einfache String-Darstellung

<?php
$data = new ArrayIterator([3.14, 2.71, 1.41]);
$cache = new CachingIterator(
    $data,
    CachingIterator::TOSTRING_USE_CURRENT
);

foreach ($cache as $wert) {
    // __toString() des CachingIterators gibt current() als String zurück
    echo (string) $cache . "\n";
}
3.14 2.71 1.41

// Wichtig · Fallstricke

Speicherverbrauch: Das Flag CachingIterator::FULL_CACHE hält alle iterierten Werte im RAM. Bei sehr großen Iteratoren (z. B. Datenbank-Resultsets) kann das zu Memory-Exhaustion führen. In solchen Fällen sollte entweder auf FULL_CACHE verzichtet oder die Datenmenge vorab begrenzt werden.

Standard-Flag: Ohne explizite Angabe ist CachingIterator::CALL_TOSTRING aktiv. Das bedeutet, auf jedem Element wird __toString() aufgerufen. Enthält der Iterator Objekte ohne __toString()-Methode, wirft PHP eine BadMethodCallException. In diesem Fall sollte stattdessen CachingIterator::TOSTRING_USE_CURRENT oder ein anderes Flag gewählt werden.

Countable: count($cache) liefert nur dann ein sinnvolles Ergebnis, wenn FULL_CACHE gesetzt ist und der Iterator bereits vollständig durchlaufen wurde. Andernfalls wird nur die Anzahl der bisher gecachten Elemente zurückgegeben.