2011-08-22 11 views
12

Zastanawiam się, jaka jest różnica między tymi dwoma przypadkami, a która z nich jest zalecana?

$val = 0; 

if (!$val) { 
    //True 
} 

if (empty($val) { 
    //It's also True 
} 

Odpowiedz

21

Spójrz na PHP type comparison table.

Jeśli zaznaczysz tabelę, zauważysz, że dla wszystkich przypadków empty($x) jest taka sama jak !$x. Sprowadza się to do obsługi niezainicjowanych zmiennych. !$x tworzy E_NOTICE, podczas gdy empty($x) nie.

+0

+1. Zauważ także, że jest to to samo, co '! = [Wynik boolowski wartości $ val]', więc ostatnia kolumna pierwszej tabeli jest najczęściej tym, na co powinieneś patrzeć. – rockerest

+0

+1 Ładne znalezisko w tabeli porównawczej. –

+0

Dzięki, to właśnie musiałem wiedzieć. Więc myślę, że puste ($ x) jest bezpieczniejsze podejście. Zakładam, że różnica jest pomijalna pod względem wydajności, prawda? – Bachx

4

Jeśli użyjesz pustego, a zmienna nigdy nie zostanie ustawiona/utworzona, nie zostanie wygenerowane ostrzeżenie/błąd.

3

Zobaczmy:

empty documentation:

Następujące rzeczy są uważane za empty:

  • "" (pusty ciąg znaków)
  • 0 (0 jako liczba całkowita)
  • 0.0 (0 jako pływak)
  • "0" (0 jako łańcuch)
  • NULL
  • FALSE
  • array() (pusta tablica)
  • var $var; (zmienna uznane, ale bez wartości w klasa)

Booleans documentation:

Podczas przekształcania do wartości logicznej następujące wartości uznaje FALSE:

  • logiczna FALSE sam
  • liczbę całkowitą 0 (zero)
  • pływak 0.0 (zero)
  • pusty ciąg znaków i ciąg znaków "0"
  • tablicą zero elementów
  • przedmiotem zero zmiennych składowych (PHP 4 jedynie)
  • specjalny typ NULL (w tym zmiennych wyłączony)
  • SimpleXML obiektów utworzone z pustych znaczników

Wydaje się, że jedyną różnicą (w odniesieniu do wartości wynikowej) jest sposób obsługi instancji SimpleXML.Cała reszta wydaje się dawać taki sam wynik (jeśli oczywiście odwracasz boolean).

+0

Więc jaki jest wniosek? Z listy wynika, że ​​boolean wygląda na bardziej niezawodny test ... –

+0

To jest nieprawidłowe. Szybki test w powłoce PHP ujawnia, że ​​'empty' obsługuje puste instancje' SimpleXMLElement', takie jak '!' Does; jest to po prostu błąd w "pustej" dokumentacji, że nie są tam wymienione. –

Powiązane problemy