Question Quelle est l'utilisation du symbole @ en PHP?


J'ai vu des utilisations de @ devant certaines fonctions, comme par exemple:

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

Quelle est l'utilité de ce symbole?


493
2018-06-23 12:08


origine


Réponses:


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


563
2018-06-23 12:09



Il supprime les erreurs.

Voir Opérateurs de contrôle d'erreur dans le manuel:

PHP prend en charge un opérateur de contrôle d'erreur: le signe at (@). Lorsqu'ils sont ajoutés à une expression dans PHP, les messages d'erreur qui pourraient être générés par cette expression seront ignorés.

Si vous avez défini une fonction de gestionnaire d'erreur personnalisée avec set_error_handler () alors il sera toujours appelé, mais ce gestionnaire d'erreur personnalisé peut (et devrait) appeler error_reporting () qui retournera 0 lorsque l'appel qui a déclenché l'erreur a été précédé d'un @ ...


402
2018-06-23 12:09



le @ symbole est le contrôle d'erreur opérateur (alias l'opérateur "silence" ou "fermé"). Il fait en sorte que PHP supprime tous les messages d'erreur (avis, avertissement, fatal, etc.) générés par l'expression associée. Cela fonctionne comme un opérateur unaire, par exemple, il a une préséance et une associativité. Voici 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"

Que se passe-t-il exactement si vous utilisez un gestionnaire d'erreurs personnalisé au lieu du gestionnaire d'erreur PHP standard:

Si vous avez défini une fonction de gestionnaire d'erreur personnalisée avec   set_error_handler () alors il sera toujours appelé, mais cette coutume   le gestionnaire d’erreur peut (et doit) appeler error_reporting () qui   retourne 0 lorsque l'appel qui a déclenché l'erreur a été précédé d'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'erreurs n'a pas vérifié si @ le 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;
}

192
2018-01-25 10:53



Notez également que malgré les erreurs masquées, tout gestionnaire d’erreur personnalisé (défini avec set_error_handler) sera toujours exécuté!


54
2018-01-11 14:48



Comme déjà certains ont déjà répondu: @ L'opérateur supprime toutes les erreurs dans PHP, y compris les notifications, les avertissements et même les erreurs critiques.

MAIS:  S'il vous plaît, n'utilisez pas vraiment le @ opérateur du tout.

Pourquoi?

Eh bien, parce que quand vous utilisez le @ Opérateur pour la suppression d'erreur, vous n'avez aucune idée de l'endroit où commencer quand une erreur se produit. J'ai déjà eu du "fun" avec le code hérité où certains développeurs utilisaient le @ opérateur assez souvent. Surtout dans les cas comme les opérations de fichiers, les appels réseau, etc. Ce sont tous les cas où beaucoup de développeurs recommandent l'utilisation de la @ L'opérateur est parfois hors de portée lorsqu'une erreur se produit ici (par exemple, une API tierce peut être inaccessible, etc.).

Mais à quoi bon ne pas l'utiliser? Jetons un coup d'oeil de deux perspectives:

En tant que développeur: Quand @ est utilisé, je n'ai absolument aucune idée par où commencer. S'il y a des centaines ou même des milliers d'appels de fonction avec @ l'erreur pourrait être comme everyhwere. Aucun débogage raisonnable possible dans ce cas. Et même si c'est juste une erreur de la part de la 3ème partie - alors c'est très bien et vous avez terminé rapidement. ;-) De plus, il est préférable d'ajouter suffisamment de détails au journal des erreurs pour que les développeurs puissent facilement décider si une entrée de journal doit être vérifiée ou s'il ne s'agit que d'une défaillance de la tierce partie hors de la portée du développeur.

En tant qu'utilisateur: Les utilisateurs ne se soucient pas du tout de la raison d'une erreur. Le logiciel est là pour qu'ils puissent fonctionner, pour terminer une tâche spécifique, etc. Ils se fichent de savoir si c'est la faute du développeur ou un problème de tierce partie. En particulier pour les utilisateurs, je recommande fortement d'enregistrer toutes les erreurs, même si elles sont hors de portée. Peut-être que vous remarquerez qu'une API spécifique est déconnectée fréquemment. Que pouvez-vous faire? Vous pouvez parler à votre partenaire API et s'il n'est pas en mesure de le maintenir stable, vous devriez probablement rechercher un autre partenaire.

En bref: Vous devez savoir qu'il existe quelque chose comme @ (la connaissance est toujours bonne), mais juste ne l'utilise pas. De nombreux développeurs (en particulier ceux qui déboguent du code d'autres utilisateurs) seront très reconnaissants.


27
2018-04-27 14:35



Si l'ouverture échoue, une erreur de niveau E_WARNING est générée. Vous pouvez utiliser @ pour supprimer cet avertissement.


5
2017-08-12 10:41



Supposons que nous n'ayons pas utilisé l'opérateur "@" alors notre code ressemblerait à ceci:

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

Et si le fichier que nous essayons d'ouvrir n'est pas trouvé? Il affichera un message d'erreur.

Pour supprimer le message d'erreur, nous utilisons l'opérateur "@" comme:

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

5
2018-03-22 05:35



"@" supprime les messages d'erreur.

Il est utilisé dans les extraits de code comme:

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

Si le domaine "http://www.exaple.com"n'est pas accessible, une erreur sera affichée, mais avec '@' rien n'est montré.


2
2017-10-14 13:02