Mam pytanie dotyczące NULL
w PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
Dlaczego widzę, że jest pusty, gdy $a
jest pusty ciąg? Czy to błąd?
Mam pytanie dotyczące NULL
w PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
Dlaczego widzę, że jest pusty, gdy $a
jest pusty ciąg? Czy to błąd?
Odpowiedzi:
To czego szukasz to:
if($variable === NULL) {...}
Uwaga ===
.
Kiedy używasz ==
, tak jak zrobiłeś, PHP traktuje NULL , false , 0 , pusty ciąg i puste tablice jako równe.
== null
do pustego ciągu, a nie tylko są puste lub niezdefiniowane.
$a = ''
jest pustym string
, false
boolowskim, $a = 0;
jest liczbą całkowitą i null
pochodzi z typu null
. OP mówi, że PHP wątkuje je jako „takie same” pod względem wartości, ale nie jako „takie same” pod względem typu. Dlatego ścisła ===
kontrola sprawdzi także typ i zakończy się niepowodzeniem, jeśli użyjesz innych. To jest powód, dla którego powinieneś być konsekwentny w swoich wartościach zwracanych. Jeśli normalnie zwrócisz ciąg znaków w metodzie takiej jak getName()
, nie powinieneś dostać, null
gdy jest pusty, ale bardziej prawdopodobne jest ciąg pusty $user->getName() === ''
lub $user->getId() === 0
lub $user->isActive === false
. Zamierzone zachowanie!
Jak pokazano w poniższej tabeli, empty($foo)
jest równoważne $foo==null
i is_null($foo)
pełni tę samą funkcję $foo===null
. Tabela pokazuje również pewne trudne wartości dotyczące null
porównania. (ϕ oznacza niezainicjowane zmienne.)
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
Nigdy nie używam empty()
i nie is_null()
działam. Korzystanie z prostego porównania jest mniej dwuznaczne, szybsze i czystsze. W szczególności będzie mniej pasujących nawiasów klamrowych.
np. if($x==null || $y==null)
vsif(is_null($x) || is_null($y))
==null
i ===null
.
sprawdź ==
vs===
'' == NULL
zwróci prawdę
0 == NULL
zwróci prawdę
false == null
zwróci prawdę
natomiast
'' === NULL
zwróci fałsz
0 === NULL
zwróci fałsz
false === NULL
zwróci fałsz
Nie, to nie jest błąd. Spójrz na luźne porównania z tabelą == (druga tabela), która pokazuje wynik porównania każdej wartości w pierwszej kolumnie z wartościami w innych kolumnach:
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
[...]
"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
Nie widać, że pusty ciąg ""
w porównaniu z false
, 0
, NULL
czy ""
przyniesie prawdziwe.
Możesz zamiast tego użyć is_null
[dokumentów] lub ścisłego porównania (trzecia tabela).
0
rzutowany na ciąg: codepad.org/qi40SG3E . Tak (int)"php" == 0
.
To nie jest błąd, ale normalne zachowanie PHP. Dzieje się tak, ponieważ ==
operator w PHP nie sprawdza typu.
'' == null == 0 == false
Jeśli chcesz również sprawdzić, czy wartości mają ten sam typ, użyj ===
zamiast tego. Aby głęboko przestudiować tę różnicę, przeczytaj oficjalną dokumentację .
Użyj empty
- http://php.net/manual/en/function.empty.php .
Przykład:
$a = '';
if(empty($a)) {
echo 'is empty';
}
$variable
. To, czego chcesz, to:$variable == null
(zwróć uwagę==
)