PHP : un langage surprenant

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