[Tableaux] Un string est-il un booléen ? Abhération
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 :
Code:
1 2 3 4
| foreach($variable AS $cle => $valeur) {
if($cle == 0) { ... }
...
} |
Malgré la simplicité du code, de toutes évidences ça ne marchait pas : et pour cause, pour lui chaque clé était égale à 0 !
J'ai donc étudié cette abbération par ces lignes de test sur les strings :
Code:
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"; |
Ce qui affiche :
Citation:
ok pour 0
ok pour true
Un string, quel qu'il soit, est donc toujours égal à la valeur 0.
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 :
Code:
1 2 3 4
| if('coucou' === 1)
echo 'ok pour 1 en strict'."\n";
if('coucou' === 0)
echo 'ok pour 0 en strict'."\n"; |
qui, elles, n'affichent rien.
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 ^^