empty($var) zwraca true, jeśli zmienna nie istnieje albo jej wartość jest fałszywa: null, false, 0, 0.0, "", "0" lub pusta tablica []. Dla każdej innej wartości zwraca false. Podobnie jak isset() nigdy nie ostrzega o niezdefiniowanych zmiennych ani kluczach tablic.
empty($x) to to samo co !isset($x) || !$x. Innymi słowy: brakuje jej albo konwertuje się na false.
Które wartości są puste
Wybierz wartość w tabeli, aby zobaczyć empty() obok isset() i rzutowania (bool). Każdą komórkę obliczyło PHP 8.3.
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
Niespodzianki są na obu końcach: "0" jest puste, a " " (spacja), "0.0", "null" i [0] nie są.
"0" jest puste: klasyczny błąd
Ponieważ "0" jest fałszywe, empty() traktuje ilość 0, wynik 0 albo PIN "0" jak „nic nie wpisano”. To daje się we znaki w formularzach, gdzie każda wartość przychodzi jako łańcuch.
Dla danych tekstowych niezawodnym sprawdzeniem „nic nie wpisano” jest trim($value) === "". Zostaw empty() dla wartości, w których 0 naprawdę oznacza nic.
Sprawdzanie, czy łańcuch jest pusty
Aby dokładnie sprawdzić pusty łańcuch, porównaj z "". Aby traktować też białe znaki jako puste, najpierw użyj trim. Od PHP 5.5 empty() przyjmuje wyrażenia, więc empty(trim($s)) też działa (ale ma ten sam problem z "0").
W PHP 8.1 i nowszych trim() nie przyjmuje null bez komunikatu o przestarzałym użyciu, dlatego blok pisze trim($s ?? "").
Sprawdzanie, czy tablica jest pusta
Dla tablic empty($arr), $arr === [] i count($arr) === 0 dają tę samą odpowiedź. Zaletą empty() jest to, że działa na zmiennej lub kluczu, które mogą nie istnieć.
array_filter() bez callbacku usuwa każdą wartość fałszywą, więc to szybki sposób, by zapytać „czy ta tablica zawiera coś prawdziwego”.
Walidacja wymaganego pola formularza
!empty() to częsty sposób wymagania pola, o ile 0 nie jest poprawną odpowiedzią. Uruchom ten blok, zostaw pola puste i kliknij Send, potem je wypełnij i wyślij ponownie: skrypt wykona się jeszcze raz z wypełnionym $_POST.
empty($_POST["terms"]) obejmuje oba przypadki dla checkboxa: w ogóle niewysłany albo wysłany z pustą wartością. Strona o formularzach idzie dalej, z komunikatami błędów dla każdego pola.
empty vs isset
Obie konstrukcje są bezpieczne na niezdefiniowanych zmiennych i kluczach. Odpowiadają na różne pytania:
isset($x): czy istnieje i nie jestnull? Używaj dla opcjonalnych kluczy, checkboxów i „czy to w ogóle wysłano”.!empty($x): czy istnieje i jest prawdziwe? Używaj dla „ma coś prawdziwego”, gdy0i"0"się nie liczą.$x === ""albo$x === []: czy jest dokładnie puste? Używaj, gdy0jest poprawną wartością.
Strona o isset opisuje drugą połowę, łącznie z isset() dla kilku zmiennych naraz i różnicą względem array_key_exists().
Najczęściej zadawane pytania
Które wartości empty() uznaje w PHP za puste?
empty($x) daje true, gdy $x nie istnieje albo ma wartość null, false, 0, 0.0, "", "0" lub []. Wszystko inne nie jest puste, także " " (spacja), "0.0", "false" i [0].
Dlaczego "0" jest puste w PHP?
empty() to to samo co !$x bez ostrzeżenia dla niezdefiniowanych zmiennych, a łańcuch "0" konwertuje się na false. Dlatego empty() nie nadaje się do pól, w których 0 jest poprawną odpowiedzią; sprawdź zamiast tego $x === '' albo trim($x) === ''.
Jak sprawdzić, czy tablica jest pusta w PHP?
Działają empty($arr) i $arr === [], a także count($arr) === 0. empty() zwraca też true, gdy zmienna nie jest ustawiona, a count() na niezdefiniowanej zmiennej ostrzegłoby, a potem rzuciło TypeError dla null.
Kiedy używać empty() zamiast isset()?
Używaj isset(), gdy wystarczy wiedzieć, że wartość istnieje (checkbox został wysłany, klucz konfiguracji jest obecny). Używaj !empty(), gdy wartość musi też być niepusta, na przykład w wymaganym polu tekstowym. Uważaj na pola, w których 0 jest poprawne, bo empty('0') daje true.