php jest pusty lub pusty?


208

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:


348

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.


13
Fałsz, twój stan pasuje tylko niezainicjowany i zerowy $variable. To, czego chcesz, to: $variable == null(zwróć uwagę ==)
Thomas LAURENT

6
@ThomasLAURENT, właśnie tego szukał OP, zastanawiali się, dlaczego pasują == nulldo pustego ciągu, a nie tylko są puste lub niezdefiniowane.
Godwin

3
To mój błąd, ale twoje ostatnie zdanie doprowadziło mnie do wniosku, że NULL, false, 0 i „” były ściśle równe, co jest złe, przepraszam za nieporozumienie.
Thomas LAURENT,

3
@James jest to zamierzone zachowanie w PHP, nadal jest prawdziwe nawet w 2017 roku i przypuszczalnie będzie prawdą przez długi czas
Defrag

1
$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!
Cagatay Ulubay

225

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


2
Brakuje „0” i „0.0” w tabeli. Sprawiają, że rzeczy są naprawdę trudne, szczególnie puste (). Dlatego unikam używania empty ().
datasn.io

1
@PHPst Opieraj się na tabeli, którą pokazałeś, więc jaki jest właściwie kod php tak zwanego „prostego porównania”?
Chetabahana,

@hyip ==nulli ===null.
PHPst

To powinna być najlepsza odpowiedź, znacznie bardziej kompletna. Dzięki.
pgr

@PHPst Powiedziałeś, że proste porównanie jest mniej dwuznaczne. Czy możesz podać przykład użycia prostego porównania zamiast tych NULL pustych () itp.
Naeem Ul Wahhab

28

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


Przetestowane i poprawne. '' == null (true) while '' === null (false)
TheLegendaryCopyCoder

18

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


Tabela Luźnych porównań wydaje się sugerować, że porównanie 0 == „php” lub „php” == 0 da zarówno prawdę. Co się tam dzieje?
Robert

1
@Robert: Ciąg nie rozpoczynający się od cyfr jest konwertowany na 0rzutowany na ciąg: codepad.org/qi40SG3E . Tak (int)"php" == 0.
Felix Kling

@Robert: Miałem na myśli „kiedy rzucono na numer .
Felix Kling

12

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ę .


8

Jeśli używasz ==, php traktuje pusty ciąg lub tablicę jako null. Aby dokonać rozróżnienia pomiędzy nulla empty, użyj ===lub is_null. Więc:

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


if ($ a === NULL)
Caster


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.