web-dev-qa-db-ger.com

Was ist das @ -Symbol in PHP?

Ich habe Verwendungen von @ vor bestimmten Funktionen wie den folgenden gesehen:

$fileHandle = @fopen($fileName, $writeAttributes);

Wozu dient dieses Symbol?

532
sv_in

Es unterdrückt Fehlermeldungen - siehe Error Control Operators im Handbuch PHP.

600
RichieHindle

Es unterdrückt Fehler.

Siehe Error Control Operators im Handbuch:

PHP unterstützt einen Fehlersteuerungsoperator: das at-Zeichen (@). Wenn ein Ausdruck in PHP vorangestellt wird, werden Fehlermeldungen, die möglicherweise von diesem Ausdruck generiert werden, ignoriert.

Wenn Sie eine benutzerdefinierte Fehlerbehandlungsfunktion mit set_error_handler () festgelegt haben, wird sie trotzdem aufgerufen. Diese benutzerdefinierte Fehlerbehandlungsroutine kann (und sollte) error_reporting () aufrufen ausgelöst wurde dem Fehler ein @ ... vorangestellt.

432
Aiden Bell

Das @-Symbol ist die Fehlersteuerung Operator (auch als "Stille" oder "Stille" bezeichnet). PHP unterdrückt alle Fehlermeldungen (Hinweis, Warnung, Fatal usw.), die vom zugehörigen Ausdruck generiert werden. Es funktioniert genauso wie ein unärer Operator, es hat zum Beispiel Vorrang und Assoziativität. Nachfolgend einige Beispiele:

@echo 1 / 0;
// generates "Parse error: syntax error, unexpected T_ECHO" since 
// echo is not an expression

echo @(1 / 0);
// suppressed "Warning: Division by zero"

@$i / 0;
// suppressed "Notice: Undefined variable: i"
// displayed "Warning: Division by zero"

@($i / 0);
// suppressed "Notice: Undefined variable: i"
// suppressed "Warning: Division by zero"

$c = @$_POST["a"] + @$_POST["b"];
// suppressed "Notice: Undefined index: a"
// suppressed "Notice: Undefined index: b"

$c = @foobar();
echo "Script was not terminated";
// suppressed "Fatal error: Call to undefined function foobar()"
// however, PHP did not "ignore" the error and terminated the
// script because the error was "fatal"

Was genau passiert, wenn Sie einen benutzerdefinierten Fehlerhandler anstelle des Standard-Fehlerhandlers PHP verwenden:

Wenn Sie eine benutzerdefinierte Fehlerbehandlungsfunktion mit .__ festgelegt haben. set_error_handler () dann wird es immer noch aufgerufen, aber diese benutzerdefinierte error handler kann (und sollte) error_reporting () aufrufen, was 0 zurückgeben, wenn dem Aufruf, der den Fehler ausgelöst hat, ein @ vorangestellt wurde.

Dies wird im folgenden Codebeispiel veranschaulicht:

function bad_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
    echo "[bad_error_handler]: $errstr";
    return true;
}
set_error_handler("bad_error_handler");
echo @(1 / 0);
// prints "[bad_error_handler]: Division by zero"

Der Fehlerbehandler hat nicht geprüft, ob das @-Symbol in Kraft war. Das Handbuch schlägt Folgendes vor:

function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
    if(error_reporting() !== 0) {
        echo "[better_error_handler]: $errstr";
    }
    // take appropriate action
    return true;
}
211
Salman A

Beachten Sie außerdem, dass trotz ausgeblendeter Fehler alle benutzerdefinierten Fehlerbehandlungsroutinen (mit set_error_handler festgelegt) weiterhin ausgeführt werden!

58
nickf

Wie schon einige Antworten: Der @-Operator unterdrückt alle Fehler in PHP, einschließlich Benachrichtigungen, Warnungen und sogar kritische Fehler.

BUT: Bitte verwenden Sie den @-Operator wirklich nicht.

Warum?

Nun, denn wenn Sie den @-Operator für die Fehlerunterdrückung verwenden, haben Sie überhaupt keine Ahnung, wo er beginnen soll, wenn ein Fehler auftritt. Ich hatte bereits "Spaß" mit altem Code, bei dem einige Entwickler den @-Operator häufig verwendeten. Insbesondere in Fällen wie Dateioperationen, Netzwerkaufrufen usw. In vielen Fällen empfehlen viele Entwickler die Verwendung des @-Operators, da hier manchmal ein Fehler auftritt, wenn ein Fehler auftritt .).

Aber was ist der Sinn, es noch nicht zu benutzen? Lass uns einen Blick aus zwei Perspektiven werfen:

Als Entwickler:Wenn @ verwendet wird, weiß ich absolut nicht, wo ich anfangen soll. Wenn es Hunderte oder sogar Tausende von Funktionsaufrufen mit @ gibt, könnte der Fehler wie jeder sein. In diesem Fall ist kein sinnvolles Debugging möglich. Und selbst wenn es sich nur um einen Fehler eines Drittanbieters handelt - dann ist das gut 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 etwas überprüft werden muss oder ob es sich nur um einen Drittanbieter-Ausfall handelt, der sich außerhalb des Entwicklerbereichs befindet.

Als Benutzer:Die Benutzer kümmern sich nicht darum, 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. Sie kümmern sich nicht darum, ob es an dem Entwickler oder einem Drittanbieter-Problem liegt. Insbesondere für die Benutzer empfehle ich dringend, alle Fehler zu protokollieren, auch wenn sie außerhalb des Gültigkeitsbereichs liegen. Möglicherweise stellen Sie fest, dass eine bestimmte API häufig offline ist. Was kannst du tun? Sie können mit Ihrem API-Partner sprechen, und wenn er es nicht stabil halten kann, sollten Sie wahrscheinlich nach einem anderen Partner suchen.

Kurz gesagt: Sie sollten wissen, dass es so etwas wie @ gibt (Wissen ist immer gut), aber nur verwenden Sie es nicht . Vielen Entwicklern (besonders dem Debugging-Code von anderen) wird es sehr dankbar sein.

31
Andreas

Angenommen, wir haben den Operator "@" nicht verwendet, dann würde unser Code folgendermaßen aussehen:

$fileHandle = fopen($fileName, $writeAttributes);

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:

$fileHandle = @fopen($fileName, $writeAttributes);
7
Sujeet Kumar

Wenn das Öffnen fehlschlägt, wird ein Fehler der Stufe E_WARNING generiert. Mit @ können Sie diese Warnung unterdrücken.

5
Kishor Singh

@ unterdrückt Fehlermeldungen.

Es wird in Codeausschnitten verwendet wie:

@file_get_contents('http://www.exaple.com');

Wenn die Domäne " http://www.exaple.com " nicht verfügbar ist, wird ein Fehler angezeigt, bei @ wird jedoch nichts angezeigt.

3
fico7489

PHP unterstützt einen Fehlersteuerungsoperator: das at-Zeichen (@). Wenn ein Ausdruck in PHP vorangestellt wird, werden Fehlermeldungen, die möglicherweise von diesem Ausdruck generiert werden, ignoriert.

Wenn Sie eine benutzerdefinierte Fehlerbehandlungsfunktion mit set_error_handler() festgelegt haben, wird sie trotzdem aufgerufen, aber dieser benutzerdefinierte Fehlerbehandlungsroutine kann (und sollte) error_reporting() aufrufen, die 0 zurückgibt, wenn dem Aufruf, der den Fehler ausgelöst hat, ein @ vorangestellt wurde.

<?php
/* Intentional file error */
$my_file = @file ('non_existent_file') or
    die ("Failed opening file: error was '$php_errormsg'");

// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn't exist.

?>

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 den Operator @ voranstellen. Beispielsweise können Sie Variablen Variablen voranstellen, Aufrufe, Konstanten usw. verwenden und einschließen. Sie können es nicht Funktions- oder Klassendefinitionen oder bedingten Strukturen wie if und foreach usw. voranstellen.

Warnung:-

Derzeit wird das Operator-Präfix "@" für die Fehlerkontrolle sogar deaktiviert Fehlerberichterstattung für kritische Fehler, die das Skript beenden Ausführung. Dies bedeutet unter anderem, wenn Sie "." Für .__ verwenden. Fehler von einer bestimmten Funktion unterdrücken und entweder nicht verfügbar ist oder wurde falsch geschrieben, stirbt das Skript gleich dort mit no Angabe, warum.

1
Ravi Hirani

Es könnte sinnvoll sein, hier ein paar Punkte hinzuzufügen, wenn Sie das @ verwenden, das Sie kennen sollten, um eine vollständige Auflistung dieses Beitrags anzuzeigen: http://mstd.eu/index.php/2016/06/30/php-quick-fire-was-ist-das-Symbol-für-in-php /

  1. Der Error-Handler wird auch bei vorangestelltem @ -Zeichen ausgelöst. Dies bedeutet lediglich, dass ein Fehlerlevel von 0 eingestellt ist. Dies muss in einem benutzerdefinierten Error-Handler entsprechend behandelt werden.

  2. Wenn Sie ein Include mit @ voranstellen, werden alle Fehler in der Include-Datei auf die Fehlerstufe 0 gesetzt

1
twigg

@ unterdrückt die von der Funktion ausgegebene Fehlermeldung. fopen gibt einen Fehler aus, wenn die Datei nicht beendet wird. Das Symbol @ führt die Ausführung aus, um zur nächsten Zeile zu gelangen, auch wenn die Datei nicht vorhanden ist. Mein Vorschlag würde dies in Ihrer lokalen Umgebung nicht verwenden, wenn Sie einen PHP - Code entwickeln.