Signatur
Beschreibung
ReflectionException ist die Standard-Ausnahme der PHP Reflection-API. Sie wird geworfen, wenn eine Reflektion fehlschlägt – etwa wenn eine Klasse, Methode oder Funktion nicht gefunden werden kann oder wenn ungültige Argumente an Reflection-Klassen übergeben werden.
Da ReflectionException von Exception erbt, stehen alle üblichen Methoden wie getMessage(), getCode(), getFile() und getLine() zur Verfügung. Im Gegensatz zu vielen anderen PHP-Fehlern wird bei der Reflection-API konsequent mit Ausnahmen statt mit Warnungen oder Fehlermeldungen gearbeitet, was eine saubere Fehlerbehandlung mit try/catch ermöglicht.
Typische Szenarien, in denen ReflectionException auftritt: Versuch, eine nicht existierende Klasse mit new ReflectionClass('NichtVorhanden') zu reflektieren, oder der Zugriff auf eine nicht existierende Methode über ReflectionClass::getMethod(). Auch das Aufrufen einer Methode mit falscher Parameteranzahl über ReflectionMethod::invoke() kann diese Ausnahme auslösen.
In eigenen Erweiterungen oder Frameworks, die Reflection intensiv nutzen (z. B. Dependency-Injection-Container), sollte ReflectionException stets abgefangen und in aussagekräftige Fehlermeldungen für den Anwender umgewandelt werden.
Beispiele
Nicht existierende Klasse reflektieren und Ausnahme abfangen
<?php
try {
$reflection = new ReflectionClass('NichtVorhandeneKlasse');
} catch (ReflectionException $e) {
echo 'Reflection-Fehler: ' . $e->getMessage() . PHP_EOL;
echo 'Datei: ' . $e->getFile() . ', Zeile: ' . $e->getLine() . PHP_EOL;
}
Nicht existierende Methode abrufen
<?php
class MeineKlasse {
public function vorhanden(): void {}
}
try {
$ref = new ReflectionClass(MeineKlasse::class);
$method = $ref->getMethod('nichtVorhanden');
} catch (ReflectionException $e) {
echo 'Fehler beim Zugriff auf Methode: ' . $e->getMessage() . PHP_EOL;
}
ReflectionException in einem DI-Container abfangen und umwandeln
<?php
function resolve(string $className): object {
try {
$ref = new ReflectionClass($className);
if (!$ref->isInstantiable()) {
throw new RuntimeException("Klasse '{$className}' kann nicht instanziiert werden.");
}
return $ref->newInstance();
} catch (ReflectionException $e) {
throw new RuntimeException(
"Klasse '{$className}' konnte nicht aufgelöst werden: " . $e->getMessage(),
0,
$e
);
}
}
try {
$obj = resolve('UnbekannteKlasse');
} catch (RuntimeException $e) {
echo $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Vererbungskette: ReflectionException erbt direkt von Exception. Sie implementiert keine eigenen zusätzlichen Methoden oder Eigenschaften – alle Funktionen stammen aus der Basis-Exception-Klasse.
Autoloading: Beim Reflektieren von Klassen versucht PHP, den Autoloader zu triggern. Wenn eine Klasse nicht autoloadbar ist und auch nicht existiert, wird ReflectionException geworfen. Dies kann in Tests oder beim Bootstrapping zu unerwartetem Verhalten führen, wenn der Autoloader Exceptions wirft.
Eigene Erweiterungen: Bibliotheken können ReflectionException als Basisklasse für eigene Reflection-bezogene Fehler nutzen, indem sie davon erben – das ist aber unüblich. Meistens wird sie direkt abgefangen und in domänenspezifische Ausnahmen umgewandelt.