J'ai une question concernant NULL
en PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
Pourquoi est-ce que je vois est nul quand $a
est une chaîne vide? Est-ce un bug?
J'ai une question concernant NULL
en PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
Pourquoi est-ce que je vois est nul quand $a
est une chaîne vide? Est-ce un bug?
Réponses:
Ce que vous recherchez, c'est:
if($variable === NULL) {...}
Notez le ===
.
Lorsque l'on utilise ==
, comme vous l'avez fait, PHP traite NULL , faux , 0 , la vide chaîne et vide tableaux égaux.
== null
correspondait la chaîne vide et pas seulement null ou indéfini.
$a = ''
est un vide string
, false
est un booléen, $a = 0;
est un entier et null
est de type null
. Ce qu'OP dit, c'est que PHP les enfilera comme "même" en valeur, mais pas comme "même" en type. Ainsi, une vérification stricte ===
vérifiera également le type et échouera si vous en utilisez d'autres. C'est la raison pour laquelle vous devez être cohérent dans vos valeurs de retour. Si vous retournez normalement une chaîne dans une méthode comme getName()
, vous ne devriez pas obtenir null
quand elle est vide, mais plus probablement une chaîne emtpy $user->getName() === ''
ou $user->getId() === 0
ou $user->isActive === false
. Comportement prévu!
Comme indiqué dans le tableau suivant, empty($foo)
est équivalent à $foo==null
et is_null($foo)
a la même fonction de $foo===null
. Le tableau montre également quelques valeurs délicates concernant la null
comparaison. (ϕ désigne une variable non initialisée.)
empty is_null
==null ===null isset array_key_exists
ϕ | T | T | F | F
null | T | T | F | T
"" | T | F | T | T
[] | T | F | T | T
0 | T | F | T | T
false | T | F | T | T
true | F | F | T | T
1 | F | F | T | T
\0 | F | F | T | T
Je n'utilise jamais empty()
et is_null()
fonctionne. L'utilisation d'une comparaison simple est moins ambiguë, plus rapide et plus propre. En particulier, il y aura moins de crochets bouclés à faire correspondre.
par exemple if($x==null || $y==null)
vsif(is_null($x) || is_null($y))
==null
et ===null
.
vérifier ==
vs===
'' == NULL
reviendrait vrai
0 == NULL
reviendrait vrai
false == null
reviendrait vrai
tandis que
'' === NULL
reviendrait faux
0 === NULL
reviendrait faux
false === NULL
reviendrait faux
Non ce n'est pas un bug. Jetez un œil aux comparaisons lâches avec le tableau == (deuxième tableau), qui montre le résultat de la comparaison de chaque valeur de la première colonne avec les valeurs des autres colonnes:
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
[...]
"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
Là , vous pouvez voir qu'une chaîne vide par ""
rapport à false
, 0
, NULL
ou ""
donnera vrai.
Vous voudrez peut-être utiliser is_null
[docs] à la place, ou une comparaison stricte (troisième tableau).
0
cas de conversion en chaîne: codepad.org/qi40SG3E . Alors (int)"php" == 0
.
Ce n'est pas un bug mais un comportement normal de PHP. Cela se produit parce que l' ==
opérateur en PHP ne vérifie pas le type.
'' == null == 0 == false
Si vous souhaitez également vérifier si les valeurs ont le même type, utilisez ===
plutôt. Pour étudier en profondeur cette différence, veuillez lire la documentation officielle .
Utilisez empty
- http://php.net/manual/en/function.empty.php .
Exemple:
$a = '';
if(empty($a)) {
echo 'is empty';
}
$variable
. Ce que vous voulez, c'est en fait:$variable == null
(notez le==
)