Ich habe Verwendungen von @
vor bestimmten Funktionen gesehen, wie die folgenden:
$fileHandle = @fopen($fileName, $writeAttributes);
Was ist die Verwendung dieses Symbols?
php
operators
error-suppression
sv_in
quelle
quelle
Antworten:
Es unterdrückt Fehlermeldungen - siehe Fehlerkontrolloperatoren im PHP-Handbuch.
quelle
isset()
's unnötig, umundefined offset
Fehler zu vermeiden .Es unterdrückt Fehler.
Siehe Fehlerkontrolloperatoren im Handbuch:
quelle
Das
@
Symbol ist der Fehlersteueroperator (auch bekannt als die „Stille“ oder „shut-up“ Operator). Dadurch unterdrückt PHP alle Fehlermeldungen (Hinweis, Warnung, schwerwiegend usw.), die durch den zugehörigen Ausdruck generiert werden. Es funktioniert genau wie ein unärer Operator, zum Beispiel hat es Vorrang und Assoziativität. Nachfolgend einige Beispiele:Was genau passiert, wenn Sie einen benutzerdefinierten Fehlerhandler anstelle des Standard-PHP-Fehlerhandlers verwenden:
Dies wird im folgenden Codebeispiel veranschaulicht:
Der Fehlerbehandler hat nicht überprüft, ob das
@
Symbol wirksam ist. Das Handbuch schlägt Folgendes vor:quelle
Beachten Sie auch, dass trotz ausgeblendeter Fehler jeder benutzerdefinierte Fehlerbehandler (festgelegt mit
set_error_handler
) weiterhin ausgeführt wird!quelle
Wie bereits einige zuvor beantwortet: Der
@
Bediener unterdrückt alle Fehler in PHP, einschließlich Hinweisen, Warnungen und sogar kritischen Fehlern.ABER: Bitte benutzen Sie den
@
Operator überhaupt nicht.Warum?
Nun, wenn Sie den
@
Operator zur Fehlerunterdrückung verwenden, haben Sie überhaupt keine Ahnung, wo Sie anfangen sollen, wenn ein Fehler auftritt. Ich hatte bereits etwas "Spaß" mit Legacy-Code, bei dem einige Entwickler den@
Operator ziemlich oft verwendeten. Insbesondere in Fällen wie Dateivorgängen, Netzwerkaufrufen usw. In all diesen Fällen empfehlen viele Entwickler die Verwendung des@
Operators, da dies manchmal nicht möglich ist, wenn hier ein Fehler auftritt (z. B. kann eine Drittanbieter-API nicht erreichbar sein usw.). ).Aber was bringt es, es immer noch nicht zu benutzen? Schauen wir uns zwei Perspektiven an:
Als Entwickler: Wann
@
verwendet wird, habe ich absolut keine Ahnung, wo ich anfangen soll. Wenn es Hunderte oder sogar Tausende von Funktionsaufrufen mit@
dem Fehler gibt, könnte dies wie überall sein. In diesem Fall ist kein angemessenes Debugging möglich. Und selbst wenn es sich nur um einen Fehler eines Drittanbieters handelt, ist dies in Ordnung und Sie sind schnell fertig. ;-) Außerdem ist es besser, dem Fehlerprotokoll genügend Details hinzuzufügen, damit Entwickler leicht entscheiden können, ob ein Protokolleintrag weiter geprüft werden muss oder ob es sich nur um einen Fehler eines Drittanbieters handelt, der außerhalb des Anwendungsbereichs des Entwicklers liegt.Als Benutzer: Benutzern ist es egal, was der Grund für einen Fehler ist oder nicht. Software ist für sie da, um zu arbeiten, eine bestimmte Aufgabe zu erledigen usw. Es ist ihnen egal, ob es die Schuld des Entwicklers oder ein Problem eines Drittanbieters ist. Insbesondere für die Benutzer empfehle ich dringend, alle Fehler zu protokollieren, auch wenn sie außerhalb des Gültigkeitsbereichs liegen. Vielleicht werden Sie feststellen, dass eine bestimmte API häufig offline ist. Was kannst du tun? Sie können mit Ihrem API-Partner sprechen. Wenn dieser nicht in der Lage ist, ihn stabil zu halten, sollten Sie wahrscheinlich nach einem anderen Partner suchen.
Kurz gesagt: Sie sollten wissen, dass es so etwas gibt
@
(Wissen ist immer gut), aber verwenden Sie es einfach nicht . Viele Entwickler (insbesondere diejenigen, die Code von anderen debuggen) werden sehr dankbar sein.quelle
@
ist usuig das Richtige Dies ist besonders nützlich, insbesondere wenn Sie nichttext/html
(oder ähnlich) zum Client zurückkehren. (vielleicht zurückimage/png
oder "json")if( session_status() == PHP_SESSION_NONE ) session_start();
Es ist eine Legacy-App, die ich geerbt habe, und es gibt Stellen, an denen das Setup-Skript mehrmals aufgerufen wird, sodass ich es testen muss. Was, wenn überhaupt, wäre ein Problem bei der einfachen Verwendung@session_start();
?@$this->stats['device_os'][$date][$creative_id][$device_id][$operating_system]['clicks']++;
ist viel besser als die Alternative, auf jeder Ebene Ausstellungsschecks zu haben und diese auszufüllen, wenn dies nicht der Fall ist.Angenommen, wir haben den Operator "@" nicht verwendet, dann würde unser Code folgendermaßen aussehen:
Und was ist, wenn die Datei, die wir öffnen möchten, nicht gefunden wird? Es wird eine Fehlermeldung angezeigt.
Um die Fehlermeldung zu unterdrücken, verwenden wir den Operator "@" wie folgt:
quelle
@
Problemumgehung überhaupt hat. Andere Programmiersprachen haben eine einheitliche Ausnahmebehandlung , um mit dieser Art von Szenario umzugehen. Stackoverflow.com/questions/1087365Wenn das Öffnen fehlschlägt, wird ein Fehler der Stufe E_WARNING generiert. Sie können @ verwenden, um diese Warnung zu unterdrücken.
quelle
@
unterdrückt Fehlermeldungen.Es wird in Codefragmenten verwendet wie:
Wenn auf die Domain " http://www.exaple.com " nicht zugegriffen werden kann, wird ein Fehler angezeigt, aber
@
nichts wird nicht angezeigt .quelle
PHP unterstützt einen Fehlerkontrolloperator: das at-Zeichen
(@)
. Wenn einem Ausdruck in PHP vorangestellt wird, werden alle Fehlermeldungen, die möglicherweise von diesem Ausdruck generiert werden, ignoriert.Wenn Sie eine benutzerdefinierte Fehlerbehandlungsfunktion mit festgelegt
set_error_handler()
haben, wird diese weiterhin aufgerufen, aber diese benutzerdefinierte Fehlerbehandlungsfunktion kann (und sollte) aufrufen,error_reporting()
die zurückgegeben wird,0
wenn dem Aufruf, der den Fehler ausgelöst hat, ein vorangestellt wurde@
.Hinweis:-
1) Der @ -Operator arbeitet nur mit Ausdrücken.
2) Eine einfache Faustregel lautet: Wenn Sie den Wert von etwas annehmen können, können Sie ihm den Operator @ voranstellen. Sie können es beispielsweise Variablen voranstellen, Aufrufe, Konstanten usw. ausführen und einschließen. Sie können es nicht vor Funktions- oder Klassendefinitionen oder bedingte Strukturen wie if und foreach usw. stellen.
Warnung:-
quelle
Es könnte sich lohnen, hier einige Hinweise hinzuzufügen, wenn Sie das @ verwenden, das Sie beachten sollten. Für eine vollständige Übersicht sehen Sie diesen Beitrag: http://mstd.eu/index.php/2016/06/30/php- Schnellfeuer-was-ist-das-Symbol-für-in-PHP verwendet /
Der Fehlerhandler wird auch mit dem vorangestellten @ -Symbol noch ausgelöst. Dies bedeutet lediglich, dass eine Fehlerstufe von 0 festgelegt ist. Dies muss in einem benutzerdefinierten Fehlerhandler entsprechend behandelt werden.
Wenn Sie ein Include mit @ voranstellen, werden alle Fehler in der Include-Datei auf eine Fehlerstufe von 0 gesetzt
quelle
@
unterdrückt die von der Funktion ausgelöste Fehlermeldung.fopen
löst einen Fehler aus, wenn die Datei nicht beendet wird.@
Das Symbol bewirkt, dass die Ausführung in die nächste Zeile verschoben wird, auch wenn die Datei nicht vorhanden ist. Mein Vorschlag wäre, dies nicht in Ihrer lokalen Umgebung zu verwenden, wenn Sie einen PHP-Code entwickeln.quelle