Signatur
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
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
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);
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";
}
// 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.