Eu tenho uma pergunta sobre NULL
em PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
Por que vejo que é nulo quando $a
há uma string vazia? Isso é um bug?
Eu tenho uma pergunta sobre NULL
em PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
Por que vejo que é nulo quando $a
há uma string vazia? Isso é um bug?
Respostas:
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.
== null
estava combinando a sequência vazia e não apenas nula ou indefinida.
$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ê- null
la quando estiver vazia, mas provavelmente uma string vazia $user->getName() === ''
ou $user->getId() === 0
ou $user->isActive === false
. Comportamento pretendido!
Como é mostrado na tabela a seguir, empty($foo)
é equivalente a $foo==null
e is_null($foo)
tem a mesma função de $foo===null
. A tabela também mostra alguns valores complicados em relação à null
comparaçã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))
==null
e ===null
.
cheque ==
vs===
'' == NULL
retornaria verdadeiro
0 == NULL
retornaria verdadeiro
false == null
retornaria verdadeiro
enquanto que
'' === NULL
retornaria falso
0 === NULL
retornaria falso
false === NULL
retornaria falso
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
, NULL
ou ""
vai render verdade.
Você pode usar is_null
[docs] ou comparar estritamente (terceira tabela).
0
quando convertida em uma string: codepad.org/qi40SG3E . Então (int)"php" == 0
.
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 .
Use empty
- http://php.net/manual/en/function.empty.php .
Exemplo:
$a = '';
if(empty($a)) {
echo 'is empty';
}
$variable
. O que você quer é realmente:$variable == null
(note a==
)