Signatur
Beschreibung
CompileError ist eine eingebaute PHP-Fehlerklasse, die von Error erbt und bei bestimmten Kompilierungsfehlern ausgelöst wird. Typischerweise tritt sie auf, wenn Code zur Laufzeit kompiliert wird – etwa durch eval() – und dabei ein Syntaxfehler oder ein anderer schwerwiegender Fehler erkannt wird.
Vor PHP 7.3 führten solche Fehler direkt zu einem nicht abfangbaren fatalen Fehler. Mit der Einführung von CompileError können diese Fehler nun über try/catch-Blöcke behandelt werden, was robustere Fehlerbehandlung in Anwendungen ermöglicht, die dynamisch Code kompilieren oder ausführen.
ParseError ist eine direkte Unterklasse von CompileError und wird speziell für Syntaxfehler (Parse-Fehler) geworfen, während CompileError selbst auch andere Kompilierungsfehler abdeckt, z. B. beim Verwenden ungültiger Konstantenausdrücke.
In der Praxis ist das direkte Abfangen von CompileError vor allem dann relevant, wenn man dynamisch generierten PHP-Code via eval() ausführt oder Plugins/Extensions lädt, die kompiliert werden müssen.
Beispiele
CompileError bei ungültigem eval()-Code abfangen
<?php
try {
// Ungültiger PHP-Code – erzeugt einen CompileError (ParseError)
eval('function () { return }');
} catch (\CompileError $e) {
echo 'Kompilierungsfehler abgefangen: ' . $e->getMessage() . PHP_EOL;
echo 'Datei: ' . $e->getFile() . PHP_EOL;
echo 'Zeile: ' . $e->getLine() . PHP_EOL;
}
echo 'Skript läuft weiter.' . PHP_EOL;
Unterschied zwischen CompileError und ParseError
<?php
function evaluateCode(string $code): void {
try {
eval($code);
} catch (\ParseError $e) {
// ParseError ist eine Unterklasse von CompileError
echo 'ParseError (ein Untertyp von CompileError): ' . $e->getMessage() . PHP_EOL;
} catch (\CompileError $e) {
echo 'Allgemeiner CompileError: ' . $e->getMessage() . PHP_EOL;
}
}
// Syntaxfehler – wird als ParseError geworfen
evaluateCode('$x = ;');
// Gültiger Code – kein Fehler
evaluateCode('$x = 42;');
echo 'Gültiger Code wurde erfolgreich ausgeführt.' . PHP_EOL;
// Wichtig · Fallstricke
Sicherheitshinweis: Die Verwendung von eval() gilt generell als gefährlich und sollte vermieden werden, da eingeschleuster Code ausgeführt werden kann. Das Abfangen von CompileError ersetzt keine sichere Eingabevalidierung.
Hierarchie: CompileError erbt von Error, nicht von Exception. Ein catch (\Exception $e)-Block fängt CompileError daher nicht ab. Verwende catch (\Throwable $e), um sowohl Error- als auch Exception-Instanzen zu behandeln.
Unterklassen: ParseError ist die direkte Unterklasse. Da ParseError spezifischer ist, sollte im catch-Block ParseError vor CompileError stehen.