Hinweis: Generatoren werden nur von PHP5.5 und höher unterstützt.
Generatoren bieten eine einfachere Möglichkeit, eine einfache Objektiteration zu implementieren, ohne den Leistungsaufwand und die Komplexität der Implementierung einer Klasse mit der Iterator-Schnittstelle.
Mit Generatoren können Sie Code in einen foreach-Block schreiben, um einen Datensatz zu durchlaufen, ohne ein Array im Speicher zu erstellen, was Ihre Speichergrenze erreichen oder erhebliche Verarbeitungszeit in Anspruch nehmen würde. Stattdessen können Sie eine Generatorfunktion schreiben, genau wie eine normale benutzerdefinierte Funktion, und statt einer normalen Funktion, die nur einmal zurückgibt, kann der Generator so oft wie nötig nachgeben, um Werte zu generieren, über die iteriert werden muss.
Ein einfaches Beispiel ist die Verwendung eines Generators zur Neuimplementierung der Funktion range(). Die Standardfunktion range() muss für jeden Rückgabewert ein Array im Speicher generieren, was zu einem sehr großen Array führt. Der Aufruf von „range(0, 1000000)“ führt beispielsweise dazu, dass die Speichernutzung 100 MB überschreitet.
Als Alternative können wir einen xrange()-Generator implementieren, der nur genügend Speicher benötigt, um das Iterator-Objekt zu erstellen und den aktuellen Status des Generators intern zu verfolgen, und somit weniger als 1 KB Speicher benötigt.
Beispiel #1 Range() als Generator implementieren
<?php function xrange($start, $limit, $step = 1) { if ($start < $limit) { if ($step <= 0) { throw new LogicException('step必须是正数'); } for ($i = $start; $i <= $limit; $i += $step) { yield $i; } } else { if ($step >= 0) { throw new LogicException('step必须是负数'); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } } /* 注意range() 和 xrange() 的结果在下面的统一输出中. */ echo '来自range()的单个奇数: '; foreach (range(1, 9, 2) as $number) { echo "$number "; } echo "\n"; echo '来自xrange()的单个奇数 '; foreach (xrange(1, 9, 2) as $number) { echo "$number "; } ?>
Die obige Routine gibt Folgendes aus:
Single digit odd numbers from range(): 1 3 5 7 9 Single digit odd numbers from xrange(): 1 3 5 7 9