J’ai corrigé un (vieux) bug hier, introduit dans le code il y a plus de 11 ans, modifié plusieurs fois depuis jusqu’à récemment (2018 de mémoire) et pour lequel on s’est fait avoir par la gestion soft du typage (et du cast) des données.
On avait quelque chose comme ça :
public function getURLFor($type, $value = '')
{
$core = &$GLOBALS['core'];
$url = $core->callBehavior('publicGetURLFor', $type, $value);
if (!$url) {
$url = $this->getBase($type);
if ($value) {
if ($url) {
$url .= '/';
}
$url .= $value;
}
}
return $url;
}
Et une fois corrigé ça donne ceci :
public function getURLFor($type, $value = '')
{
$core = &$GLOBALS['core'];
$url = $core->callBehavior('publicGetURLFor', $type, $value);
if (!$url) {
$url = $this->getBase($type);
if ($value !== '') {
if ($url) {
$url .= '/';
}
$url .= $value;
}
}
return $url;
}
Le bug se trouvait à la ligne 7, soit if ($value) {
qui pose problème si, par exemple, $value
est égal à '0'
(chaîne de caractère contenant le chiffre 0), parce que tester if ('0') {
sera interprété par PHP comme if (false)
. Or la chaîne '0'
est tout à fait valide et doit être prise en compte, ce qui est fait correctement avec if ($value !== '') {
!
Voilà le piège de la conversion de valeur en PHP, spécialement avec les chaînes contenant '0'
!
D’ailleurs je pense que cette fonction et probablement plein d’autres, gagneraient à bénéficier du typage des arguments et des retours, dans la mesure du possible, parce que ça simplifie le code sous-jacent vu que les types sont connus d’emblée ; on a parfois juste à jongler entre pas de valeur (null
) et une valeur d’un type précis.
PS : Va falloir que je retouche légèrement le style du code en ligne (dans le corps du texte), ça fait un peu pâté quand il y en a beaucoup, vous ne trouvez pas ?
1 De Véro -
C’est bon le pâté ! :-) Je =>
2 De Franck -
Voilà, une pincée de :
Et c’est tout de suite plus lisible.
3 De Pascal -
Bonjour Frank, Je ne vois pas explicitement le thème que tu utilises. Je suis arrivé ici via ductile photos. Est-ce le bon thème ? Peux-tu m’en dire plus ? Merci
4 De Franck -
Bonjour Pascal, il s’agit du thème Berlin (distribué avec Dotclear), que j’ai légèrement modifié :-)