web-dev-qa-db-fra.com

Pourquoi PHP traite "0" comme FAUX dans des contextes booléens?

"0", comme une chaîne contenant un caractère, n'est pas quelque chose de vide intuitivement. Pourquoi PHP le traite-t-il comme FAUX lorsqu'il est converti en booléen, contrairement aux autres langages de programmation?

12
Michael Tsang

PHP a été conçu (ou, plutôt, évolué) pour une utilisation avec les requêtes Web, où vous êtes fréquemment confronté à la saisie de chaînes (paramètres d'URL ou POST requêtes à partir d'un formulaire dans un navigateur). tel, il convertira automatiquement les chaînes en d'autres types.

Un exemple simple de ceci est que '1' + '2' Donne 3, Pas une erreur, ou '12 ', Ou une autre interprétation. Par la même logique, la chaîne '0' Peut être utilisée comme un 0 Numérique.

Pendant ce temps, comme de nombreux langages, PHP traite certaines valeurs comme "fausses" lorsqu'elles sont converties en booléens - celles qui sont intuitivement "vides", comme vous le dites. Cela inclut les 0 Numériques, ainsi que la chaîne vide '' et le tableau vide []. Dans une instruction if, l'expression est explicitement convertie en booléen, donc if ( 0 ) est identique à if ( false ).

En réunissant ces deux choses, vous obtenez une énigme: d'une part, comme vous dites '0' Est une chaîne non vide; d'autre part, nous avons dit qu'il peut être utilisé comme un 0 numérique, qui est "vide". PHP opte pour traiter le "zéro-ness" comme plus important que la "stringence", de sorte que '0' Est considéré comme "faux".

En bref: '0' == 0 == false; ou (bool)'0' === (bool)(int)'0'

12
IMSoP

Selon la documentation PHP documentation sur booléens , il est dit que:

Lors de la conversion en booléen, les valeurs suivantes sont considérées comme FALSE
...
la chaîne vide et la chaîne "0"
...

Autrement:

Toute autre valeur est considérée comme VRAIE (y compris toute ressource).

Si vous exécutez:

var_dump((bool) "0");

Il imprimera:

bool (faux)

Cela fonctionne donc comme prévu.


Pour répondre explicitement à votre question:

Cependant, dans la plupart des cas, la conversion n'est pas nécessaire, car une valeur sera automatiquement convertie si un opérateur, une fonction ou une structure de contrôle nécessite un argument booléen.

Cela signifie que la "diffusion automatique" de PHP convertira "0" en entier 0, ce qui est FALSE également dans une structure de contrôle comme disons une instruction if().

3
kayess