Pourquoi faut-il bannir l'arobase de tout code PHP ?

Nombreux sont les développeurs (débutants ou non) qui utilisent l'arobase (@) pour masquer les erreurs. C'est un peu cacher la misère et c'est surtout un énorme problème lorsqu'il s'agît de trouver un bug dans un code où fleurissent les arobases.

L'arobase est un opérateur de contrôle d'erreur. Si on préfixe une expression (affectation de variable, include ou require, expression de comparaison,...) par cet opérateur, les messages d'erreurs qui pourraient éventuellement être générés sont ignorés et par conséquent ne sont pas affichés. C'est de là que vient le problème. Les débutants ne maîtrisant pas tous les concepts du langage utilisent l'arobase pour arriver plus vite à leurs fins. On ne peut pas les blâmer mais le remède est pire que le mal !

Le principal problème de cet opérateur est qu'il ne masque pas que le problème que l'on a sur le moment. Il masque toutes les erreurs dont les erreurs critiques qui stoppent le programme. Par exemple, si une variable ou une fonction est mal orthographiée, on ne le saura pas.

Voici un exemple de code à ne pas reproduire qui produirait sans l'arobase un message d'avertissement "Notice Undefined index var ..." :

$ma_var = @$_GET['var'];

Si la variable $_GET['var'] n'existe pas, on ne le saura pas et on devra faire le test ultérieurement. Donc autant tester directement :

if (isset($_GET['var'])) {
   $ma_var = $_GET['var'];
} else {
   $ma_var = '';
}

Dans l'exemple précédent il y a peu de conséquences. Imaginons que l'on veuille inclure un fichier de configuration que s'il existe. Une mauvaise pratique serait de préfixer l'inclusion par un arobase :

@include 'conf.inc.php';

De prime abord on pourrait penser qu'on a atteint le but souhaité. Si le fichier n'existe pas, on n'aura pas d'erreurs ; dans le cas contraire il sera inclus. Pour rendre les choses plus claires imaginons le code suivant :

$nom = 'Pouce';
$prenom = 'Tom';
@include 'conf.inc.php';
echo "Bonjour $prenom $nom";

Et voici le contenu du fichier conf.inc.php :

$prenom = 'Nicolas';
$nom = 'Cémoi';

Bon l'intérêt de ce code est plus que discutable mais en revanche il va permettre d'expliquer plus clairement mon propos. Si le fichier existe, et que le script courant peut l'inclure alors on aura le super message : "Bonjour Nicolas Cémoi". Si le fichier n'existe pas on aura le message : "Bonjour Tom Pouce". Jusque là tout va bien.

Maintenant supposons que le fichier soit bien là mais qu'il y ait une erreur dans le fichier conf.inc.php, par exemple qu'il manque le point virgule à la fin de la première ligne. On n'aura aucun message d'erreur, mais comme l'erreur est critique l'exécution du script s'arrête et on n'a pas de message du tout. L'exécution du script s'arrête à la ligne où on tente de faire l'inclusion du fichier. L'arobase a masqué l'erreur de syntaxe "Parse error: syntax error, unexpected T_VARIABLE ...". L'exemple est très simple et on ne fait appel qu'à deux fichiers mais si on fait de nombreuses inclusions, et/ou des inclusions en cascade, trouver le problème devient un vrai casse-tête.

Encore une fois, le code pour éviter le problème est d'une simplicité enfantine :


if (file_exists('conf.inc.php')) {
   include 'conf.inc.php';
}

L'utilisation de l'arobase est une très mauvaise pratique qui est à bannir. Elle crée plus de problèmes qu'elle n'en résoud.

Il y a tout de même des exceptions à cette pratique : si on teste l'erreur. Par exemple lorsqu'on veut créer une connexion à une base de données pour ne pas afficher d'erreur si un problème survenait, on peut utiliser l'arobase devant la fonction pg_connect() (ou mysql_connect() ou ...). Il faut bien entendu ensuite tester le retour de la fonction qui est soit false soit une ressource de connexion.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.