Tomber en marche


Celle ci je ne peux me rete­nir de la copier car elle est magni­fique :

$override = null;
if ($notify_admin and $conf['browser_language'])
{
  if (!get_browser_language($override['language']))
  {
    $override=null;
  }
}

À première vue, le code ne fait rien. À la seconde lecture non plus, je vous rassure.

Après expli­ca­tion, la méthode get_browser_language utilise un passage par réfé­rence (oui, avec ce nom là…), c’est à dire que la variable qui est passée en argu­ment pourra voir sa valeur modi­fiée.

Eureka! En sortie de code on pour­rait bien avoir une variable $override qui contient quelque chose. On a au passage fait une créa­tion de tableau impli­cite en utili­sant la syntaxe avec crochets sur une valeur nulle (conseil : ne jamais faire ça si vous souhai­tez rester lisible).

La seconde affec­ta­tion $override=null sert si jamais get_browser_language a bien modi­fié $override['language'] mais a renvoyé une valeur évaluée à false.

Mais pourquoi cette seconde affec­ta­tion à null ? Et bien il se trouve que la fonc­tion get_browser_language renvoie false si elle ne modi­fie pas la variable passée par réfé­rence. Dans ce cas le code d’ap­pel aurait quand même créé un tableau dans $override à cause de override['language'], il faut donc reve­nir en arrière et écra­ser ce tableau créé impli­ci­te­ment.

À rete­nir :

  1. Ne jamais créer de tableau implic­te­ment avec l’opé­ra­teur crochet sur une valeur null.
  2. Ne jamais attendre un retour par réfé­rence sur une fonc­tion qui s’ap­pelle « get_* »
  3. Globa­le­ment, ne quasi­ment jamais utili­ser le passage par réfé­rence pour récu­pé­rer une simple valeur.

Ici en plus vu qu’on utilise déjà l’éva­lua­tion à true ou false du retour de get_browser_language, autant lui faire retour­ner direc­te­ment la langue, ou null si aucune n’est trou­vée.


Une réponse à “Tomber en marche”

  1. Bonjour Eric,

    Merci pour ces remarques et conseils. Je suis d’accord, le code, bien que fonctionnel, est illisible (ou presque) et donc difficile à maintenir (et dans un projet comme Piwigo, c’est crucial car ce code est là depuis des années et sera encore là dans plusieurs années).

    Je viens de commiter http://piwigo.org/shortlinks/svn/29840 : plus de passage par référence, retour du code langue ou false, pas de création implicite de clef/valeur dans le tableau associatif.

    Qu’en penses tu ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.