php é nulo ou vazio?


208

Eu tenho uma pergunta sobre NULLem PHP:

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

Por que vejo que é nulo quando $ahá uma string vazia? Isso é um bug?

Respostas:


348

O que você está procurando é:

if($variable === NULL) {...}

Observe o ===.
Quando o uso ==, como você fez, PHP trata NULL , falso , 0 , o vazio corda, e vazias matrizes como iguais.


13
Falso, sua condição corresponde apenas a não inicializado e nulo $variable. O que você quer é realmente: $variable == null(note a ==)
Thomas LAURENT

6
@ThomasLAURENT, era isso que o OP estava procurando, eles estavam se perguntando por que == nullestava combinando a sequência vazia e não apenas nula ou indefinida.
Godwin

3
Opa, meu erro, mas sua última frase me levou a pensar que NULL, false, 0 e "" eram estritamente iguais, o que está errado, desculpe-me pelo mal-entendido.
Thomas LAURENT

3
@ James é um comportamento desejado em PHP, ainda é verdade mesmo em 2017 e será verdadeiro por um longo tempo eu suponho
Defrag

1
$a = ''é um vazio string, falseé um booleano, $a = 0;é um número inteiro e nullé do tipo null. O que o OP está dizendo é que o PHP os encadeará como "iguais" em valor, mas não como "iguais" em tipo. Portanto, uma verificação rigorosa === também verificará o tipo e falhará se você usar diferentes. Essa é a razão pela qual você deve ter consistência nos seus valores de retorno. Se você normalmente retorna uma string em um método como getName(), não deve obtê- nullla quando estiver vazia, mas provavelmente uma string vazia $user->getName() === ''ou $user->getId() === 0ou $user->isActive === false. Comportamento pretendido!
Cagatay Ulubay

225

Como é mostrado na tabela a seguir, empty($foo)é equivalente a $foo==nulle is_null($foo)tem a mesma função de $foo===null. A tabela também mostra alguns valores complicados em relação à nullcomparação. (ϕ indica variáveis ​​não inicializadas.)

         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   

Eu nunca uso empty()e is_null()funções. Usar comparação simples é menos ambíguo, mais rápido e mais limpo. Particularmente, haverá menos colchetes para combinar.

por exemplo, if($x==null || $y==null)vsif(is_null($x) || is_null($y))


2
Faltam "0" e "0,0" na tabela. Eles tornam as coisas realmente complicadas, especialmente vazias (). É por isso que evito usar empty ().
datasn.io

1
@PHPst Base na tabela que você mostrou, então qual é realmente o código php do que você chamou de 'comparação simples'?
Chetabahana

@hyip ==nulle ===null.
PHPst

Essa deve ser a resposta principal, muito mais completa. Obrigado.
pgr 30/03

@PHPst Você disse que a comparação simples é menos ambígua. Você pode fornecer um exemplo de uso simples comparação, em vez de estes NULL esvaziar () etc.
Naeem Ul Wahhab

28

cheque ==vs===

'' == NULLretornaria verdadeiro
0 == NULLretornaria verdadeiro
false == nullretornaria verdadeiro

enquanto que

'' === NULLretornaria falso
0 === NULLretornaria falso
false === NULLretornaria falso


Testado e correto. '' == null (true), enquanto '' === nula (false)
TheLegendaryCopyCoder

18

Não, não é um bug. Dê uma olhada na tabela Comparações frouxas com == (segunda tabela), que mostra o resultado da comparação de cada valor na primeira coluna com os valores nas outras colunas:

    TRUE    FALSE   1       0       -1      "1"     "0"     "-1"    NULL    array() "php"   ""

    [...]    

""  FALSE   TRUE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   TRUE

Lá você pode ver que uma string vazia ""em comparação com false, 0, NULLou ""vai render verdade.

Você pode usar is_null [docs] ou comparar estritamente (terceira tabela).


A tabela de comparações frouxas parece sugerir que comparar 0 == "php" ou "php" == 0 produzirá true. O que está acontecendo lá?
31413 Robert

1
@Robert: Uma string que não começa com dígitos é convertida 0quando convertida em uma string: codepad.org/qi40SG3E . Então (int)"php" == 0.
Felix Kling

@ Robert: eu quis dizer "quando convertido para um número " .
precisa

12

Este não é um bug, mas o comportamento normal do PHP. Isso acontece porque o ==operador no PHP não verifica o tipo.

'' == null == 0 == false

Se você também quiser verificar se os valores têm o mesmo tipo, use ===. Para estudar profundamente essa diferença, leia a documentação oficial .


8

Se você usa ==, o php trata uma string ou matriz vazia como null. Para fazer a distinção entre nulle empty, use ===ouis_null . Assim:

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


if ($ a === NULL)
Rodador


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.