À quoi sert le symbole @ en PHP?

j'ai vu des utilisations de @ devant certaines fonctions, comme le suivant:

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

à quoi sert ce symbole?

503
demandé sur Peter Mortensen 2009-06-23 16:08:32
la source

11 ответов

Il supprime les messages d'erreur, voir Erreur de commande, les Opérateurs dans le manuel PHP.

573
répondu RichieHindle 2016-12-28 11:16:06
la source

il supprime les erreurs.

voir Error Control Operators dans le manuel:

PHP supporte un opérateur de contrôle des erreurs: le signe at (@). Lorsqu'il est ajouté à une expression en PHP, tout message d'erreur qui pourrait être généré par cette expression sera ignoré.

si vous avez défini une fonction de gestionnaire d'erreurs personnalisée avec set_error_handler () alors il sera toujours être appelé, mais ce gestionnaire d'erreurs 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 @...

410
répondu Aiden Bell 2016-09-07 18:48:40
la source

le symbole @ est l'opérateur contrôle d'erreur 151980920" (aka l'opérateur" silence "ou" shut-up"). Il fait PHP supprimer tous les messages d'erreur (notice, warning, fatal, etc) générés par l'expression associée. Il fonctionne comme un opérateur unaire, par exemple, il a une priorité et associativité des opérateurs. En 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'erreur personnalisé au lieu du standard de PHP gestionnaire d'erreur:

si vous avez défini une fonction de gestionnaire d'erreurs personnalisé avec set_error_handler () alors il sera quand même appelé, mais cette le gestionnaire d'erreurs peut (et devrait) appeler error_reporting () qui va renvoie 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;
}
199
répondu Salman A 2018-02-03 13:50:44
la source

notez aussi que malgré les erreurs cachées, tout gestionnaire d'erreurs personnalisé (défini avec set_error_handler ) sera quand même exécuté!

55
répondu nickf 2010-01-11 17:48:24
la source

comme certains ont déjà répondu avant: l'opérateur @ supprime toutes les erreurs en PHP, y compris les notices, les avertissements et même les erreurs critiques.

mais: S'il vous plaît, vraiment ne pas utiliser l'opérateur @ du tout.

pourquoi?

bien, parce que quand vous utilisez l'opérateur @ pour erreur la suppression, vous n'avez aucune idée par où commencer lorsqu'une erreur se produit. J'ai déjà eu un certain "plaisir "avec le code d'héritage où certains développeurs ont utilisé l'opérateur @ assez souvent. Surtout dans les cas comme les opérations de fichiers, les appels réseau, etc. Ce sont tous des cas où beaucoup de développeurs recommandent l'utilisation de l'opérateur @ car cela est parfois hors de portée quand une erreur se produit ici (par exemple une API 3rdparty pourrait être inaccessible, etc.).

mais qu'est-ce que point n'est toujours pas l'utiliser? Regardons de deux points de vue:

en tant que développeur: quand @ est utilisé, Je n'ai absolument aucune idée où commencer. S'il y a des centaines ou même des milliers d'appels de fonction avec @ l'erreur pourrait être comme tout le monde. Aucun débogage raisonnable possible dans ce cas. Et même si c'est juste une erreur 3rdparty - alors c'est très bien et vous êtes fait rapidement. ;-) Outre, il est préférable d'ajouter suffisamment de détails au journal des erreurs, de sorte que les développeurs sont en mesure de décider facilement si une entrée de journal est quelque chose qui doit être vérifié plus loin ou si c'est juste une défaillance 3rdparty qui est hors de la portée du développeur.

en tant qu'utilisateur: les utilisateurs ne se soucient pas du tout ce que la raison d'une erreur est ou non. Le logiciel est là pour qu'ils travaillent, pour finir une tâche spécifique, etc. Ils ne se soucient pas si c'est la faute du développeur ou un 3rdparty problème. Surtout pour les utilisateurs, je recommande fortement d'enregistrer toutes les erreurs, même si elles sont hors de portée. Vous remarquerez peut-être qu'une API spécifique est souvent déconnectée. Que pouvez-vous faire? Vous pouvez parler à votre partenaire API et s'ils ne sont pas en mesure de le maintenir stable, vous devriez probablement chercher un autre partenaire.

en bref: vous devez savoir qu'il existe quelque chose comme @ (la connaissance est toujours bonne), mais juste faire ne pas l'utiliser . Beaucoup de développeurs (en particulier ceux qui déboguent du code d'autres développeurs) seront très reconnaissants.

27
répondu Andreas 2016-04-27 17:35:44
la source

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

5
répondu Kishor Singh 2013-08-12 14:41:56
la source

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
répondu Sujeet Kumar 2015-12-06 14:36:40
la source

@ supprime les messages d'erreur.

il est utilisé dans les snippets 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 pas montré.

2
répondu fico7489 2018-08-18 14:21:41
la source

PHP prend en charge un opérateur de contrôle des erreurs: le signal at (@) . Lorsqu'il est ajouté à une expression en PHP, tout message d'erreur qui pourrait être généré par cette expression sera ignoré.

si vous avez défini une fonction custom error handler avec set_error_handler() alors elle sera quand même appelée, mais cette fonction custom error handler 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 @ .

<?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.

?>

Remarque:-

1) l'opérateur @ne travaille que sur les expressions.

2) Une règle simple: si vous pouvez prendre la valeur de quelque chose, vous pouvez faire précéder l'opé[email protected] Par exemple, vous pouvez le préparer aux variables, à la fonction et inclure les appels, les constantes, et ainsi de suite. Vous ne pouvez pas le préparer à des définitions de fonction ou de classe, ou des structures conditionnelles comme si et foreach, et ainsi de suite.

avertissement: -

actuellement le préfixe de l'opérateur de contrôle d'erreur " @ " sera même désactivé rapport d'erreur pour les erreurs critiques qui termineront le script exécution. Entre autres choses, cela signifie que si vous utilisez "@" pour supprimer les erreurs d'une certaine fonction et soit il n'est pas disponible ou a été mal orthographié, le script va mourir là avec pas de indication de la raison.

1
répondu Ravi Hirani 2016-02-17 11:50:45
la source

il pourrait être utile d'ajouter ici Il ya quelques conseils lorsque vous utilisez le @ vous devriez être conscient de, pour une vue complète vers le bas de ce post: http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/

  1. le gestionnaire d'erreurs est toujours activé même avec le @ symbol prépayé, cela signifie simplement qu'un niveau d'erreur de 0 est défini, cela devra être géré de manière appropriée dans un gestionnaire d'erreurs personnalisé.

  2. préparation d'une inclusion avec @ définira toutes les erreurs dans le fichier d'inclusion à un niveau d'erreur de 0

1
répondu twigg 2016-06-30 17:35:28
la source

@ supprime le message d'erreur lancé par la fonction. fopen envoie une erreur quand le fichier ne sort pas. @ symbole fait l'exécution pour passer à la ligne suivante même le fichier n'existe pas. Ma suggestion serait de ne pas l'utiliser dans votre environnement local lorsque vous développez un code PHP.

0
répondu Logamurugan Pilavadi Santhanam 2018-08-18 14:22:43
la source

Autres questions sur php operators error-suppression