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?

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.


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))


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


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).


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 .


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))


if ($ a === NULL)
Caster


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.