Bonsoir,
confronté à un problème dans un script, c'est l'incompréhension face à une abbération qui a suivie.
J'utilise un foreach et je souhaite appliquer un traitement différent à la valeur correspondante à la clé 0, par le biais d'une simple expression conditionnelle.
En toute logique et en résumé j'écris donc :
Malgré la simplicité du code, de toutes évidences ça ne marchait pas : et pour cause, pour lui chaque clé était égale à 0 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 foreach($variable AS $cle => $valeur) { if($cle == 0) { ... } ... }
J'ai donc étudié cette abbération par ces lignes de test sur les strings :
Ce qui affiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 if('coucou' == 1) echo 'ok pour 1'."\n"; if('coucou' == 0) echo 'ok pour 0'."\n"; if('coucou' == true) echo 'ok pour true'."\n"; if('coucou' == false) echo 'ok pour false'."\n";
Un string, quel qu'il soit, est donc toujours égal à la valeur 0.ok pour 0
ok pour true
Mais comme un string est évidemment qqch de toujours vrai, il est aussi égal à la valeur true.
Mais il n'est pas par défaut égal à 1.
Sachant que 0 correspond à false et 1 à true, pourquoi et comment un string peut-il être par défaut considéré à la fois égal à 0 et à true ?
Pour compléter le test j'ai ensuite ajouté ces lignes :
qui, elles, n'affichent rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if('coucou' === 1) echo 'ok pour 1 en strict'."\n"; if('coucou' === 0) echo 'ok pour 0 en strict'."\n";
Il existe donc une différence entre le zéro décimal et le zéro booléen, soit.
Ma question, si je la résume est donc : pourquoi PHP considére-t-il toutes chaines comme égale à 0, ce qui ne peut absolument pas s'expliquer par sa booléanité ?
La ligne "if($var == 0)" est donc une abbération ?
Merci d'avance pour vos réponses,
ça me tracasse ^^
Partager