© saicle/Shutterstock.com
Verbesserte Performance des @-Operators

Shut up already


Der @-Operator stellt eine schnelle und einfache Variante dar, um Fehlermeldungen zu unterdrücken. Mit ihm einher geht immer auch eine Geschwindigkeitseinbuße, die in PHP 5.4 nun verringert wurde. Unterdrückte Fehlermeldungen tauchen anschließend aber in keiner Log-Datei mehr auf, was bedeutet, dass eine allzu umfangreiche Nutzung des Operators zu einer erschwerten Fehlersuche und -behebung führt. Dieser Artikel beleuchtet die Vor- und Nachteile des @-Operators, warum man ihn vermeiden sollte, wenn nicht unbedingt nötig, und wie groß der Unterschied zwischen PHP 5.3, PHP 5.4 und einer Nichtbenutzung wirklich ist.

Stellt man das @ in PHP vor einen Ausdruck, werden alle Fehlermeldungen, die von diesem Ausdruck erzeugt werden, unterdrückt. Ein Ausdruck kann zum Beispiel eine Variablenbenutzung oder ein Funktionsaufruf sein, häufig wird er bei include()-Aufrufen eingesetzt. Warum das meistens keine gute Idee ist, zeige ich später noch. In PHP 5.4 wurden nun die Geschwindigkeitseinbußen etwas verringert, die mit dieser Art der Fehlerunterdrückung einhergehen. Im Changelog steht: Improved performance of @ (silence) operator.

Der so genannte Fehler-Kontroll-Operator

Der @-Operator, auch Silent-, Silence- oder Shutup-Operator genannt, unterdrückt Fehlermeldungen, die in der entsprechenden Zeile bzw. den aufgerufenen Untermethoden auftreten. Auf den ersten Blick macht das natürlich Sinn, denn man möchte seinen Webseitenbesuchern schließlich keine Fehlermeldungen präsentieren, doch das Problem sollte besser anders gelöst werden. So unterdrückte Fehlermeldungen sind nämlich in keiner Log-Datei enthalten, sodass eine Fehlersuche für den Entwickler sehr nervenaufreibend werden kann. Besser ist es, den Fehler nicht zu unterdrücken damit er weggeloggt wird, aber die Ausgabe an den Browser zu deaktivieren (display_errors = 0). Man stelle sich sonst ein Projekt vor, in dem vor jeder zehnten Zeile der @-Operator steht, und dann bricht das Script plötzlich ohne Fehlermeldungen ab. Wie soll man da den Fehler finden?

Ich habe schon Code gesehen, in dem der Operator sehr häufig genutzt wurde. Vor jedem fopen() und file_get_contents(), bei dem auf eine lokale Datei zugegriffen wurde, war aus Prinzip ein @. Stattdessen hätte man besser vorher mit file_exists() prüfen sollen, ob die Datei existiert, oder noch besser mit is_readable() nachschauen sollen, ob die Datei existiert und lesbar ist.

Oder bei jeder Division, bei der der Divisor auch 0 sein könnte, wurde einfach ein @ ges...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang