php est nul ou vide?

208

J'ai une question concernant NULLen PHP:

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

Pourquoi est-ce que je vois est nul quand $aest une chaîne vide? Est-ce un bug?

Erin Tucker
la source

Réponses:

348

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.

Godwin
la source
13
Faux, votre condition ne correspond qu'à non initialisé et nul $variable. Ce que vous voulez, c'est en fait: $variable == null(notez le ==)
Thomas LAURENT
6
@ThomasLAURENT, c'est ce que l'OP recherchait, ils se demandaient pourquoi == nullcorrespondait la chaîne vide et pas seulement null ou indéfini.
Godwin
3
Oups mon erreur, mais votre dernière phrase m'a fait penser que NULL, false, 0 et "" étaient strictement égaux, ce qui est faux, désolé pour le malentendu.
Thomas LAURENT
3
@James c'est un comportement prévu en PHP, c'est toujours vrai même en 2017 et le sera encore longtemps je suppose
Defrag
1
$a = ''est un vide string, falseest un booléen, $a = 0;est un entier et nullest 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 nullquand elle est vide, mais plus probablement une chaîne emtpy $user->getName() === ''ou $user->getId() === 0ou $user->isActive === false. Comportement prévu!
Cagatay Ulubay
225

Comme indiqué dans le tableau suivant, empty($foo)est équivalent à $foo==nullet is_null($foo)a la même fonction de $foo===null. Le tableau montre également quelques valeurs délicates concernant la nullcomparaison. (ϕ 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))

PHPst
la source
2
"0" et "0.0" manquants dans le tableau. Ils rendent les choses vraiment délicates, surtout vides (). C'est pourquoi j'évite d'utiliser empty ().
datasn.io
1
@PHPst Base sur la table que vous avez montrée, alors quel est réellement le code php de ce que vous avez appelé la "comparaison simple"?
Chetabahana
@hyip ==nullet ===null.
PHPst
Cela devrait être la meilleure réponse, beaucoup plus complète. Merci.
pgr
@PHPst Vous avez dit qu'une comparaison simple est moins ambiguë. Pouvez-vous fournir un exemple d'utilisation d'une comparaison simple au lieu de ces valeurs NULL empty () etc.
Naeem Ul Wahhab
28

vérifier ==vs===

'' == NULLreviendrait vrai
0 == NULLreviendrait vrai
false == nullreviendrait vrai

tandis que

'' === NULLreviendrait faux
0 === NULLreviendrait faux
false === NULLreviendrait faux

jancha
la source
Testé et correct. '' == null (true) while '' === null (false)
TheLegendaryCopyCoder
18

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, NULLou ""donnera vrai.

Vous voudrez peut-être utiliser is_null [docs] à la place, ou une comparaison stricte (troisième tableau).

Felix Kling
la source
Le tableau des comparaisons lâches semble suggérer que la comparaison de 0 == "php" ou "php" == 0 donnera toutes les deux la valeur true. Que se passe-t-il ici?
Robert
1
@Robert: Une chaîne qui ne commence pas par des chiffres est convertie en 0cas de conversion en chaîne: codepad.org/qi40SG3E . Alors (int)"php" == 0.
Felix Kling
@Robert: Je voulais dire "lorsqu'il est converti en nombre " .
Felix Kling
12

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 .

Aurelio De Rosa
la source
8

Si vous utilisez ==, php traite une chaîne ou un tableau vide comme null. Pour faire la distinction entre nullet empty, utilisez ===ou is_null. Alors:

if($a === NULL) ou if(is_null($a))

Dayuloli
la source
if ($ a === NULL)
Caster
6

PHP 7 isset () vs empty () vs is_null ()

entrez la description de l'image ici

Foued MOUSSI
la source