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.


Publié

dans

par

Étiquettes :

Commentaires

Une réponse à “Tomber en marche”

  1. Avatar de Pierrick Le Gall

    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. Les champs obligatoires sont indiqués avec *