633 votes

Quelle est l’utilisation de @ symbole en php ?

J’ai vu à l’aide de `` en face de certaines fonctions comme suit :

Quelle est l’utilisation de ce symbole ?

694voto

RichieHindle Points 98544

Il supprime les messages d’erreur - voir Opérateurs de contrôle d’erreur dans le manuel PHP.

495voto

Aiden Bell Points 19856

251voto

Salman A Points 60620

L' @ symbole est le contrôle d'erreur de l'opérateur (aka le "silence" ou "shut-up" de l'opérateur). Il rend PHP supprimer tous les messages d'erreur (avis, avertissement, fatale, etc) généré par les associés expression. Il fonctionne comme un opérateur unaire, par exemple, il a une priorité et associativité des opérateurs. Ci-dessous, quelques exemples:

@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"

Exactement ce qui se passe si vous utilisez un gestionnaire d'erreur personnalisé au lieu du standard de PHP gestionnaire d'erreur:

Si vous avez défini un gestionnaire d'erreur personnalisé fonction avec set_error_handler() alors il sera encore appelés, mais cette coutume gestionnaire d'erreur peut (et doit) faire appel à la fonction error_reporting (), qui sera retourner la valeur 0 lorsque l'appel qui a déclenché l'erreur a été précédée par un @.

Ceci est illustré dans l'exemple de code suivant:

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"

Le gestionnaire d'erreur de ne pas vérifier si @ symbole était en vigueur. Le manuel suggère ce qui suit:

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

59voto

nickf Points 185423

Notez également que, malgré les erreurs étant cachés, un gestionnaire d’erreurs personnalisées (avec `` ) sera toujours exécuté !

5voto

Kishor Singh Points 21

Si l’ouverture échoue, une erreur de niveau E_WARNING est générée. Pour supprimer cet avertissement, vous pouvez utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X