web-dev-qa-db-fra.com

Casting de type vers booléen

Quelqu'un peut-il m'expliquer pourquoi cela:

var_dump((bool) 1==2);

retour

bool(true)

mais

var_dump(1==2);

retour

bool(false)

Bien sûr, le deuxième retour est correct, mais pourquoi à la première occasion, php renvoie une valeur inattendue?

45
Paris Liakos

Ce n'est pas aussi étrange qu'il n'y paraît. (bool) a une priorité plus élevée que == , donc ceci:

var_dump((bool) 1==2);

est équivalent à ceci:

var_dump(  ((bool) 1)   == 2);

ou ca:

var_dump(true == 2);

En raison de type jonglage , le 2 est également essentiellement converti en bool (car il s'agit d'une "comparaison approximative"), il est donc équivalent à ceci:

var_dump(true == true);

ou ca:

var_dump(true);
88
ruakh

Parce que dans le premier exemple, le cast a lieu avant la comparaison. C'est comme si tu écrivais

((bool) 1)==2

ce qui équivaut à

true == 2

qui est évalué en convertissant 2 à true et la comparaison, pour finalement produire true.

Pour voir le résultat attendu, vous devez ajouter des parens pour rendre l'ordre explicite:

var_dump((bool)(1==2));

Voyez-le en action.

20
Jon

J'utilise de cette façon:

!!0 (false)
!!1 (true)
7
user2678106

La façon dont vous avez écrit l'instruction ((bool) 1 == 2) retournera toujours true car elle exécutera toujours le code comme ci-dessous:

Tout d'abord, il exécutera

(bool)1

et (bool) 1 retournera vrai.

Maintenant que (bool) 1 est vrai à la deuxième étape, votre déclaration sera comme

true ==2

Puisque si nous transtypons 2 en booléen, cela retournera vrai, à l'état final, votre déclaration sera comme

true == true

Ce qui reviendra évidemment vrai. La même chose que j'ai expliquée il y a un an dans mon article PHP Type Casting également.

0
Ankur Kumar Singh