Vor einigen Tagen wurde in einigen Blogs [1][2] diskutiert, ob die Funktion/Sprachkonstrukt die() bzw. exit() sinnvoll ist, wie man sie einsetzen sollte oder ob sie eigentlich aus PHP entfernt werden kann. Hab mich dazu näher mal damit beschäftigt und möchte folgende Verhaltensweise festhalten:

Ist zum Zeitpunkt des Aufrufs von die/exit ein instantiierten Objekt vorhanden, wird noch die „__destruct()“ Methode aufgerufen. Das gilt für jedes Objekt zu diesem Zeitpunkt. Das Skript ist also noch nicht 100%ig beendet: Es kann noch Code ausgeführt werden!
Diese Tatsache wollte ich dazu verwenden, eine Exception in einem Destruktor auszulösen welche den Exit Befehl aufhebt/überspringt. Somit könnte man mit der Instantiierung eines „ExitDestuktors“ die Verwendung von die/exit komplett unterbinden und man hätte eine schöne auffangbare Exception:

class ExitDestructor{
  public function __destruct(){
    throw new Exception("immortality");
  }
}
$exitDestructor = new ExitDestructor();
try {
  die();
} catch (Exception $ex) {
  //handle exception
}

Leider hat das nicht hingehauen. Vielleicht geht es ja mit PHP 5.3+ mit einem goto Befehl x). PHP meldet auf jeden Fall „Fatal error: Exception thrown without a stack frame in Unknown on line 0„. Dieser Fehler würde übrigens auch dann auftreten, wenn ein Skript Ordnungsgemäß beendet wird, was auch nicht gewollt wäre.
» Experiment fehlgeschlagen.

Schade. Wäre ein netter „dieToExeptionWrapper“ geworden. Da sollte man sich echt Gedanken machen, wozu man die/exit überhaupt einsetzten soll. Mir ist es schon in folgenden sinnvollen Zusammenhängen über den Weg gelaufen:
1. Meta Redirect aus dem Skript heraus auslösen: die(‚<meta http-equiv=“refresh“ content=“0; URL=‘.$url.'“>‘); – Das könnte man aber auch mit einer „RedirectException“ lösen.
2. Nach dem direkten Senden einer Datei an den Browser. Danach sollte nämlich kein einziges Byte mehr gesendet/ausgegeben werden! (Davor übrigens auch nicht.)

Der zweite Punkt ist der einzige Anwendungsfall der mir eingefallen ist, bei dem eine Exception eher weniger weiterhelfen würde! Dann ist die/exit dann also doch gerettet? Oder erhebt jemand Einspruch?

Advertisements