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 subtilits du langage PHP s'avre trs 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 chanes de caractres. Bien que cela puisse paratre surprenant, ce comportement est tout fait normal. Pour le comprendre, il faut se souvenir de la manire dont PHP ralise les comparaisons entre valeurs de types diffrents. PHP tant un language faiblement typ, pour pouvoir comparer ce qui est comparable, il doit parfois raliser implicitement des conversions de type (transtypage, ou casting) sur l'une des 2 oprandes. Ainsi, dans le cas d'une comparaison nombre/chane, il est important de savoir que c'est toujours la chane qui est implicitement caste en nombre.
// cette condition sera vrifie
echo (0 == 'A') ? 'TRUE' : 'FALSE';

// car elle est identique 
echo (0 == (int)'A') ? 'TRUE' : 'FALSE';
Et comme on sait que le casting d'une chane non numrique en un nombre retournera tout logiquement la valeur 0, voil notre condition vrifie !

Bien entendu, une comparaison stricte l'aide de l'oprateur "triple gal" nous aurait offert le rsultat initialement attendu puisqu'il ralise une comparaison aussi bien les valeurs que sur les types.

// cette condition ne sera pas vrifie
echo (0 === 'A') ? 'TRUE' : 'FALSE';
Il faut aussi savoir que la fonction in_array possde elle mme le moyen de raliser cette comparaison stricte car elle accepte un dernier paramtre optionnel qui permet d'activer ou non cette fonctionnalit. Non active par dfaut, il nous aurait fallu crire ds le dpart :
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 extrme vigilance, j'ajouterai qu'avant d'accuser le langage d'un nouveau bug, il est peut-tre utile d'envisager une ventuelle dfaillance du programmeur ;)

Liens utiles

<<< Retour

Vos commentaires

2 commentaires posts

Lexie Picard
21/01/2021 13:46Post par Lexie Picard
Je ne suis pas vraiment dou?e en informatique, mais je savais que le troisi?me param?tre strict est d?fini ? true et la fonction In ray v?rifiera ensuite le type de param?tre needie. Merci ? vous.
cialis buy online
02/06/2020 17:09Post par cialis buy online
I read this paragraph fully regarding the resemblance
of hottest and previous technologies, it's amazing
article.

Ragir cet article

*


(Ne sera pas publie, servira uniquement afficher votre gravatar)


(Lien en dur et dofollow)

zend framework