PHP : un langage surprenant
Par Alexis Lefebvre le dimanche 29 juillet 2012, 19:00 - Lien permanent
J'ai rencontré deux problèmes avec le langage PHP récemment.
0 == "a"
En parcourant les éléments d'une liste je ne comprenais pas pourquoi un test ne renvoyait pas le résultat attendu. Il s'avère que la comparaison d'une chaîne de caractères avec 0 renvoie toujours vrai, sauf si la chaîne de caractères est convertible en un nombre :
> php -r 'print((0 == "a") ? "oui" : "non"); print("\n");' oui > php -r 'print((0 == "1") ? "oui" : "non"); print("\n");' non
Ce comportement peut être modifié en spécifiant les types des valeurs :
> php -r 'print(((string)0 == (string)"a") ? "oui" : "non"); print("\n");' non
À ce jour, le bug est toujours en attente.
Des paramètres inutiles
PHP ne lève aucune alerte si un appel à une fonction contient davantage de paramètres que la fonction n'en accepte :
> php -r 'function test($a, $b) {print("ok\n");} test(1, 2, 3, 4);' ok
Ce bug provoque des surprises car si on modifie une fonction mais pas ses appels, des arguments ne seront plus utilisés sans que cela ne lève d'erreur, amenant à des comportements inattendus.
Des bugs documentés
En cherchant des explications à ces incohérences je suis tombé sur deux ressources en particulier.
Le blog PHP WTF liste d'autres exemples de comportements surprenants de PHP.
Un billet très ambitieux à tenté de lister toutes les incohérences dans le langage PHP, et il y en a ! Bien que l'article soit très critique, c'est très instructif de connaître les limites du langage afin de ne pas rester bloqué lorsqu'on atteint celles-ci.
Configuration utilisée
> php -v PHP 5.3.6-13ubuntu3.8 with Suhosin-Patch (cli) (built: Jun 13 2012 18:02:19) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies