Mam pytanie dotyczące NULLw PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
Dlaczego widzę, że jest pusty, gdy $ajest pusty ciąg? Czy to błąd?
Mam pytanie dotyczące NULLw PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
Dlaczego widzę, że jest pusty, gdy $ajest 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.
== nulldo pustego ciągu, a nie tylko są puste lub niezdefiniowane.
$a = ''jest pustym string, falseboolowskim, $a = 0;jest liczbą całkowitą i nullpochodzi 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ć, nullgdy jest pusty, ale bardziej prawdopodobne jest ciąg pusty $user->getName() === ''lub $user->getId() === 0lub $user->isActive === false. Zamierzone zachowanie!
Jak pokazano w poniższej tabeli, empty($foo)jest równoważne $foo==nulli is_null($foo)pełni tę samą funkcję $foo===null. Tabela pokazuje również pewne trudne wartości dotyczące nullporó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))
==nulli ===null.
sprawdź ==vs===
'' == NULLzwróci prawdę
0 == NULLzwróci prawdę
false == nullzwróci prawdę
natomiast
'' === NULLzwróci fałsz
0 === NULLzwróci fałsz
false === NULLzwró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, NULLczy ""przyniesie prawdziwe.
Możesz zamiast tego użyć is_null [dokumentów] lub ścisłego porównania (trzecia tabela).
0rzutowany 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ę==)