Ecrire du code conforme à E_ALL

Référence sur drupal.org : 9 Avril 2009 – 01h34 - http://drupal.org/node/34341


E_ALL : une meilleure pratique

Actuellement, le code Drupal n’est pas coforme E_STRICT. Quand vous faites tourner un site Drupal avec E_ALL, chaque page crée des tonnes de messages d’erreurs. Beaucoup de développeurs Drupal pensent qu’il serait bon que le code Drupal soit mis en conformité avec les bonnes pratiques couramment admises.

Le but de ce document est double :

  1. Montrer comment des erreurs courantes de programmation empêchent Drupal d’être conforme à E_STRICT
  2. Fournir de meilleures règles de programmation pour le code nouveau et les patches.

Une fois que ces règles seront acquises, ce ne sera plus qu’une question de temps, et d’efforts pour les développeurs, pour que tout le code antérieur soit corrigé. Nous pourrons ensuite faire tourner Drupal avec la directive E_ALL.

Erreurs de programmation courantes et nouvelles habitudes

Utilisation de if (isset($var)) ou if (!empty($var))

Si vous voulez vérifier qu’un tableau a bien reçu une valeur, ne faites pas :

<?php
if ($foo) {}
?>

mais faites plutôt :

<?php
// either
if (isset($foo)) {} // $foo=0 (zero) and $foo= '' return TRUE
// or
if (!empty($foo)) {} // use this when 0 or '' are not expected
// and are not valid values for $foo.
?>

La différence entre isset() et !empty() est qu’à l’inverse de !empty(), isset() renverra TRUE même si la variable a été initialisée avec une chaîne vide ou l’entier 0. Pour déterminer quelle fonction utiliser, étudiez si 0 ou '' sont des valeurs possibles pour votre variable.

Le code suivant est incorrect :

<?php
function _form_builder($form$parents = array(), $multiple FALSE) {
  
// (...)
  
if ($form['#input']) {
    
// some code (...)
  
}
}
?>

Ici, la variable $form est passée à la fonction. Si $form['#input'] a été initialisé avec n’importe quelle valeur, some code est exécuté. Le problème est qu’en testant de cette façon, cela affiche le message d’erreur suivant :

notice: Undefined index:  #input in includes/form.inc on line 194.

Même si le tableau $form est déjà déclaré et passé à la fonction, chaque index doit exlicitement être déclaré. Le code précédent devrait plutôt être écrit comme ceci :

<?php
function _form_builder($form$parents = array(), $multiple FALSE) {
  
// (...)
  
if (!empty($form['#input'])) {
    
// some code (...)
  
}
}
?>

Attention !

La fonction isset() renvoie TRUE quand la variable est initialisée avec l’entier 0, mais FALSE lorsqu’elle l’est avec la valeur NULL. Dans certains cas, is_null() est préférable, surtout lorsqu’il s’agit de tester une valeur retournée par une requête SQL.

Tester les messages d’erreurs

Si vous voulez aider au nettoyage du code Drupal pour qu’il soit confome à E_STRICT, vous pouvez paramétrer un site de test et modifier le fichier includes/common.inc :

<?php
if ($errno & (E_ALL E_NOTICE)) {
?>

en :

<?php
if ($errno & (E_ALL )) {
?>

Commentaires

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <css>, <php>, <html>, <ccss>, <ccss>, <drupal5>, <drupal6>, <html>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".
  • You may use [view:viewname] tags to display listings of nodes.

Plus d'informations sur les options de formatage

CAPTCHA
Cette question permet d'éviter le spam :
13 + 7 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.