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?

Erin Tucker
fonte

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.

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

PHPst
fonte
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

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

Felix Kling
fonte
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 .

Aurelio De Rosa
fonte
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))

dayuloli
fonte
if ($ a === NULL)
Rodador
6

PHP 7 isset () vs vazio () vs is_null ()

insira a descrição da imagem aqui

MOUSSI com falta
fonte