PHP : programmer sans erreurs du type « notice »
J’en connais certains qui aiment avoir un code PHP qui ne génère aucune erreur du type « notice« . Une erreur notice, c’est lorsque, par exemple, on essaye de traiter une variable qui n’est pas initialisée :
//$bob = "pas initialisée, c'est un commentaire"; print $bob; // cela va générer une erreur de type notice
Il ne s’agit pas d’erreur au sens propre du terme. PHP est un langage de script, beaucoup moins rigoureux qu’un « vrai » langage, comme Java par exemple. S’accorder de telles libertés dans le code ne l’empêchera pas de fonctionner. Pour ma part, un code qui générerait d’innombrable erreur de ce type notice ne me dérangerait pas. Ainsi, une solution simple pour en finir avec elle consiste à changer le niveau du rapport d’erreur. Par exemple, en tout début de code, quelque chose comme :
error_reporting(E_ALL | ~E_NOTICE);
Ou dans le fichier php.ini :
error_reporting = E_ALL | ~E_NOTICE
Cependant, cela ne fait que masquer le problème – si tant est que ça en soit un -, puisque les erreurs de ce type continuent d’exister ; elles ne sont simplement plus affichée.
Pour bien faire, la vraie solution rigoureuse consistera alors à récrire son code de façon à ce qu’il n’en génère plus. Comme la plupart de ces erreurs sont souvent dues à des variables non initialisées que l’on utilise sans les tester, une solution simple consiste à s’assurer qu’elles ont bien une valeur avant toute chose. Par exemple, le code de tout à l’heure devient :
//$bob = "pas initialisée, c'est un commentaire";
if(isset($bob))
{
print $bob; // cela va générer une erreur notice
}
else
{
// faire autre chose
}
On comprend que répéter ce code à chaque fois peut être facilement très fastidieux… Mais on peut s’éviter cette peine grâce à la petite fonction suivante :
function getIfSet(& $var, $default = null)
{
if(isset($var))
{
return $var;
}
else
{
return $default;
}
}
Cette fonction prend en premier argument la variable que l’on souhaite utiliser, mais dont on ignore si elle est initialisée ou non. Le deuxième argument, qui est optionnel (et est à null par défaut), est la valeur qui sera renvoyée s’il se trouve que la variable n’est pas initialisée :
//$bob = "pas initialisée, c'est un commentaire"; print $bob; // cela va générer une erreur de type notice print getIfSet($bob); // cela ne génère pas d'erreur et n'affiche rien print getIfSet($bob, "pas initialisée"); // cela affiche "pas initialisée"
Cette fonction sera à coup sûr très utile à tous ceux qui souhaitent débarrasser leur code de ce type d’erreurs !