Facebook LinkedIn SourceForge Twitter RSS LastFM
logologo

Un effet pervers du transtypage avec in_array

Geoffray Warnants|27/05/2008|2 commentaires

Malgré son apparente simplicité, voici un bel exemple qui montre qu'une bonne connaissance des subtilités du langage PHP s'avère très importante :
in_array(0, array('A','B','C'));   // Retourne TRUE !!
Cette instruction montre que pour PHP, le nombre 0 se trouve bien dans le tableau ne comportant que des chaînes de caractères. Bien que cela puisse paraître surprenant, ce comportement est tout à fait normal. Pour le comprendre, il faut se souvenir de la manière dont PHP réalise les comparaisons entre valeurs de types différents. PHP étant un language faiblement typé, pour pouvoir comparer ce qui est comparable, il doit parfois réaliser implicitement des conversions de type (transtypage, ou casting) sur l'une des 2 opérandes. Ainsi, dans le cas d'une comparaison nombre/chaîne, il est important de savoir que c'est toujours la chaîne qui est implicitement castée en nombre.
// cette condition sera vérifiée
echo (0 == 'A') ? 'TRUE' : 'FALSE';

// car elle est identique à
echo (0 == (int)'A') ? 'TRUE' : 'FALSE';
Et comme on sait que le casting d'une chaîne non numérique en un nombre retournera tout logiquement la valeur 0, voilà notre condition vérifiée !

Bien entendu, une comparaison stricte à l'aide de l'opérateur "triple égal" nous aurait offert le résultat initialement attendu puisqu'il réalise une comparaison aussi bien les valeurs que sur les types.

// cette condition ne sera pas vérifiée
echo (0 === 'A') ? 'TRUE' : 'FALSE';
Il faut aussi savoir que la fonction in_array possède elle même le moyen de réaliser cette comparaison stricte car elle accepte un dernier paramètre optionnel qui permet d'activer ou non cette fonctionnalité. Non activée par défaut, il nous aurait fallu écrire dès le départ :
in_array(0, array('A','B','C'), true);   // Retourne FALSE
Pour conclure, outre le fait que profiter du confort offert par le faible typage de PHP ne se fait pas sans une extrême vigilance, j'ajouterai qu'avant d'accuser le langage d'un nouveau bug, il est peut-être utile d'envisager une éventuelle défaillance du programmeur ;)

Liens utiles

<<< Retour

Réagir à cet article

*


(Ne sera pas publiée, servira uniquement à afficher votre gravatar)


(Lien en dur et dofollow)

zend framework