Celle ci je ne peux me retenir de la copier car elle est magnifique :
$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 explication, 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 argument pourra voir sa valeur modifiée.
Eureka! En sortie de code on pourrait bien avoir une variable $override
qui contient quelque chose. On a au passage fait une création de tableau implicite en utilisant la syntaxe avec crochets sur une valeur nulle (conseil : ne jamais faire ça si vous souhaitez rester lisible).
La seconde affectation $override=null
sert si jamais get_browser_language
a bien modifié $override['language']
mais a renvoyé une valeur évaluée à false
.
Mais pourquoi cette seconde affectation à null
? Et bien il se trouve que la fonction get_browser_language
renvoie false
si elle ne modifie pas la variable passée par référence. Dans ce cas le code d’appel aurait quand même créé un tableau dans $override
à cause de override['language']
, il faut donc revenir en arrière et écraser ce tableau créé implicitement.
À retenir :
- Ne jamais créer de tableau implictement avec l’opérateur crochet sur une valeur
null
. - Ne jamais attendre un retour par référence sur une fonction qui s’appelle « get_* »
- Globalement, ne quasiment jamais utiliser le passage par référence pour récupérer une simple valeur.
Ici en plus vu qu’on utilise déjà l’évaluation à true
ou false
du retour de get_browser_language
, autant lui faire retourner directement la langue, ou null
si aucune n’est trouvée.
Une réponse à “Tomber en marche”
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 ?