isset () i empty () - czego użyć

105

Czy możesz mi pomóc ulepszyć mój styl kodowania? :) W niektórych zadaniach muszę sprawdzić - czy zmienna jest pusta lub zawiera coś. Aby rozwiązać to zadanie, zwykle wykonuję następujące czynności.

Sprawdź - czy ta zmienna jest ustawiona czy nie? Czy jest ustawione - sprawdzam - jest puste czy nie?

<?php
    $var = '23';
    if (isset($var)&&!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

I mam pytanie - czy powinienem użyć isset () przed empty () - czy to konieczne? TIA!

Dmitry Belaventsev
źródło
puste jest! isset ($ var) || $ var == false
zloctb
2
w moim przekonaniu empty () jest przerażającym rozwinięciem PHP. Ponieważ uważa "0" w dowolnej formie za "puste", możesz wpaść w złe pułapki, które kosztują dużo czasu od debugowania. Powiedziałbym: unikaj za wszelką cenę i po prostu napisz logikę samemu
John

Odpowiedzi:

143

To zależy od tego, czego szukasz, jeśli chcesz tylko sprawdzić, czy jest puste, po prostu użyj, emptyponieważ sprawdza, czy jest również ustawione, jeśli chcesz wiedzieć, czy coś jest ustawione, czy nie isset.

Empty sprawdza, czy zmienna jest ustawiona, a jeśli tak, sprawdza ją pod kątem wartości null, „”, 0 itd

Isset po prostu sprawdza, czy jest ustawiona, może to być cokolwiek niezerowego

W emptyprzypadku następujących rzeczy są uważane za puste:

  • „” (pusty ciąg)
  • 0 (0 jako liczba całkowita)
  • 0,0 (0 jako liczba zmiennoprzecinkowa)
  • „0” (0 jako ciąg)
  • ZERO
  • FAŁSZYWE
  • array () (pusta tablica)
  • var $ var; (zadeklarowana zmienna, ale bez wartości w klasie)

Z http://php.net/manual/en/function.empty.php


Jak wspomniano w komentarzach, brak ostrzeżenia jest również ważny z pustym ()

Podręcznik PHP mówi

empty () jest przeciwieństwem zmiennej (boolean), z wyjątkiem tego, że nie jest generowane żadne ostrzeżenie, gdy zmienna nie jest ustawiona .

Odnośnie problemu

Podręcznik PHP mówi

isset () zwróci FALSE, jeśli testujesz zmienną, która została ustawiona na NULL


Twój kod byłby w porządku, ponieważ:

<?php
    $var = '23';
    if (!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

Na przykład:

$var = "";

if(empty($var)) // true because "" is considered empty
 {...}
if(isset($var)) //true because var is set 
 {...}

if(empty($otherVar)) //true because $otherVar is null
 {...}
if(isset($otherVar)) //false because $otherVar is not set 
 {...}
Pez Cuckow
źródło
To znaczy - w powyższym kodzie sprawdzam, czy zmienna jest ustawiona czy nie dwa razy? :)
Dmitry Belaventsev
Po prostu sprawdź, czy jest pusty, php nie zgłosi błędu, jeśli tak nie jest.
Pez Cuckow,
3
Pomijasz największy punkt z empty: Nie generuje ostrzeżenia, gdy testowana zmienna nie istnieje. O to właśnie chodzi w tej funkcji, w przeciwnym razie jest identyczna z == false.
deceze
1
Tak więc fakt w instrukcji, że "nie jest generowane ostrzeżenie, gdy zmienna nie jest ustawiona", wprawił mnie w zakłopotanie. Brak ostrzeżenia nie oznacza, że ​​nie będę miał problemów w poniższym kodzie. Teraz jest dla mnie jasne. Wielkie dzięki!
Dmitry Belaventsev,
"isset po prostu sprawdza, czy jest ustawione, nadal może być puste" To nieprawda: issetna pustej (i istniejącej) zmiennej zostanie obliczona wartość false.
netcoder,
12

W danym przypadku: if ($var).

Musisz użyć, issetjeśli nie wiesz, czy zmienna istnieje, czy nie. Ponieważ jednak zadeklarowałeś to w pierwszym wierszu, wiesz, że istnieje, dlatego nie musisz, nie, nie powinieneś go używać isset.

To samo dotyczy emptytylko tego, że emptyłączy w sobie również sprawdzenie prawdziwości wartości. emptyjest równoważne !isset($var) || !$vari !emptyjest równoważne z isset($var) && $varlub isset($var) && $var == true.

Jeśli chcesz przetestować tylko zmienną, która powinna istnieć pod kątem prawdziwości , if ($var)jest całkowicie adekwatna i na temat.

zamrozić
źródło
Ten wyjaśnia znacznie lepiej. Jeśli otrzymamy porównanie dla wszystkich innych takich przypadków !empty is equivalent to isset($var) && $var, byłoby wspaniale. Dzięki @ deceze
Vir
6

Możesz po prostu użyć pustej () - jak widać w dokumentacji , zwróci ona false, jeśli zmienna nie ma wartości.

Przykład na tej samej stronie:

<?php
$var = 0;

// Evaluates to true because $var is empty
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}

// Evaluates as true because $var is set
if (isset($var)) {
    echo '$var is set even though it is empty';
}
?>

Możesz użyć isset, jeśli chcesz tylko wiedzieć, czy nie ma wartości NULL. W przeciwnym razie wydaje się, że pusta () jest dobra do użycia samodzielnie.

chris
źródło
Wyjaśnienie głosowania przeciw? Nie pyta, czy są takie same, pyta, czy musi sprawdzić, czy jest ustawione, zanim zaznaczy puste.
chris,
Ja nie downvote, ale „stosowanie isset jeśli chcesz wiedzieć, to nie jest pusta” nie jest poprawne: $var = null; isset( $var ) == true.
JJJ,
Z podręcznika PHP5 / 4: isset () - "Sprawdź, czy zmienna jest ustawiona i nie ma wartości NULL." us.php.net/manual/en/function.isset.php
chris
2

Oto wyniki isset()i empty()dla 4 możliwości: niezadeklarowana, zerowa, fałszywa i prawdziwa.

$a=null;
$b=false;
$c=true;

var_dump(array(isset($z1),isset($a),isset($b),isset($c)),true); //$z1 previously undeclared
var_dump(array(empty($z2),empty($a),empty($b),empty($c)),true); //$z2 previously undeclared

//array(4) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(true) [3]=> bool(true) } 
//array(4) { [0]=> bool(true) [1]=> bool(true) [2]=> bool(true) [3]=> bool(false) } 

Zauważysz, że wszystkie wyniki „isset” są przeciwieństwem wyników „pustych”, z wyjątkiem przypadku $b=false. Wszystkie wartości (z wyjątkiem wartości null, która nie jest wartością, ale nie jest wartością), których wynikiem jest fałsz, zwróci prawdę, gdy zostanie przetestowana, isseta fałsz, gdy zostanie sprawdzona wartość „puste”.

Dlatego używaj, isset()gdy martwisz się istnieniem zmiennej. I używaj, emptygdy testujesz prawdę lub fałsz. Jeżeli rzeczywista typu sprawach pustką, użytkowania is_nulli ===0, ===false, ===''.

dnagirl
źródło
1

Empty zwraca prawdę, jeśli zmienna nie jest ustawiona. Ale isset zwraca true, nawet jeśli zmienna nie jest pusta.

Whiskas
źródło
-3
$var = 'abcdef';
if(isset($var))
{
   if (strlen($var) > 0);
   {
      //do something, string length greater than zero
   }
   else
   {
     //do something else, string length 0 or less
   }
}

To jest prosty przykład. Mam nadzieję, że to pomoże.

edycja: dodana issetw przypadku, gdy zmienna nie jest zdefiniowana jak powyżej, spowodowałaby błąd, sprawdzenie, czy przynajmniej jej pierwszy zestaw pomoże usunąć trochę bólu głowy na drodze.

Akos
źródło
7
strlen poniżej zera? Chcę zobaczyć ten sznurek.
deceze
@deceze Tylko przybliżony przykład :) OK use = 0 nie <0
Akos