Start · Sprachen · PHP · Referenz · CompileError

CompileError

Klasse

Wird bei Kompilierungsfehlern geworfen, die früher einen fatalen PHP-Fehler verursachten, z. B. bei ungültigem <code>eval()</code>-Code.

seit PHP 7.3.0 Kategorie: error

Signatur

class CompileError extends Error

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;
Kompilierungsfehler abgefangen: syntax error, unexpected token "}" Datei: /var/www/html/index.php Zeile: 3 Skript läuft weiter.

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;
ParseError (ein Untertyp von CompileError): syntax error, unexpected token ";" Gültiger Code wurde erfolgreich ausgeführt.

// 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.