Start · Sprachen · PHP · Referenz · ReflectionGenerator

ReflectionGenerator

Klasse

Liefert Laufzeit-Informationen über ein <code>Generator</code>-Objekt, z. B. die aktuelle Ausführungsposition, Datei und Funktion.

seit PHP 7.0.0 Kategorie: oop

Signatur

class ReflectionGenerator

Beschreibung

ReflectionGenerator ermöglicht es, zur Laufzeit Metadaten über einen laufenden oder abgeschlossenen Generator zu inspizieren. Im Gegensatz zur klassischen Reflection, die Klassen und Funktionen beschreibt, arbeitet ReflectionGenerator mit konkreten Generator-Instanzen – also mit dem Objekt, das eine yield-Funktion zurückgibt.

Mit dieser Klasse lässt sich beispielsweise ermitteln, in welcher Datei und Zeile der Generator gerade angehalten ist (getExecutingLine()), wie die erzeugende Funktion heißt (getFunction()) und ob der Generator bereits beendet wurde. Das ist besonders nützlich für Debugging-Werkzeuge, Profiler und Fehlerverfolgung in komplexen asynchronen oder iterativen Pipelines.

Die Klasse bietet außerdem die Methode getTrace(), die – analog zu debug_backtrace() – den Aufruf-Stack zum Zeitpunkt der letzten yield-Anweisung zurückgibt. So lässt sich sehr genau nachvollziehen, wie ein Generator in den aktuellen Zustand geraten ist.

Eine typische Anwendung ist die Integration in Error-Handler oder Logging-Systeme, um bei Ausnahmen innerhalb von Generatoren aussagekräftige Stack-Traces bereitzustellen.

Parameter

Name Typ Default Beschreibung
$generator Pflicht Generator Das Generator-Objekt, über das Informationen abgerufen werden sollen. Es muss sich um eine Instanz der eingebauten Generator-Klasse handeln.

Beispiele

Grundlegende Inspektion eines Generators

<?php
function zahlenGenerator(): Generator {
    yield 1;
    yield 2;
    yield 3;
}

$gen = zahlenGenerator();
$gen->current(); // Generator starten und beim ersten yield anhalten

$ref = new ReflectionGenerator($gen);

echo 'Funktion : ' . $ref->getFunction()->getName() . PHP_EOL;
echo 'Datei    : ' . basename($ref->getExecutingFile()) . PHP_EOL;
echo 'Zeile    : ' . $ref->getExecutingLine() . PHP_EOL;
Funktion : zahlenGenerator Datei : beispiel.php Zeile : 3

Stack-Trace eines angehaltenen Generators ausgeben

<?php
function inner(): Generator {
    yield 42;
}

function outer(): Generator {
    yield from inner();
}

$gen = outer();
$gen->current();

$ref = new ReflectionGenerator($gen);

// Aktuellen Generator sowie ggf. verschachtelte Generatoren anzeigen
echo 'Ausführender Generator: ' . $ref->getFunction()->getName() . PHP_EOL;

$innerRef = $ref->getExecutingGenerator();
echo 'Innerer Generator: ' . (new ReflectionGenerator($innerRef))->getFunction()->getName() . PHP_EOL;

foreach ($ref->getTrace() as $frame) {
    echo ($frame['function'] ?? '?') . ' in ' . basename($frame['file'] ?? '?') . ':' . ($frame['line'] ?? '?') . PHP_EOL;
}
Ausführender Generator: outer Innerer Generator: inner inner in beispiel.php:4

// Wichtig · Fallstricke

Nur für laufende Generatoren sinnvoll: Viele Methoden wie getExecutingLine() oder getExecutingFile() liefern nur dann aussagekräftige Werte, wenn der Generator noch nicht beendet ist (d. h. Generator::valid() gibt true zurück). Bei einem bereits erschöpften Generator kann das Verhalten undefiniert oder die Rückgabe null sein.

Konstruktor-Ausnahme: Wird ein Nicht-Generator-Objekt übergeben, wirft der Konstruktor eine ReflectionException.

Die Methode getThis() gibt das Objekt zurück, an dem die Generator-Funktion als Methode aufgerufen wurde – oder null, wenn es sich um eine freie Funktion handelt.