Po co sprawdzać zarówno isset (), jak i! Empty ()

269

Czy istnieje różnica między isseti !empty. Jeśli wykonam tę podwójną kontrolę logiczną, czy jest to poprawne w ten sposób, czy jest zbędne? i czy istnieje krótszy sposób na zrobienie tego samego?

isset($vars[1]) AND !empty($vars[1])
silow
źródło
3
Jest ładny wykres wyników używania ich z różnymi typami zmiennych (mają różnice) tutaj: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton
Oczywistymi dokładnymi uzupełnieniami są isset i is_null, ale! Empty obejmuje kilka różnych. Wszystko zależy od typu danych, dla których testujesz.
Jeff Clayton

Odpowiedzi:

419

Jest to całkowicie zbędne. emptyjest mniej więcej skrótem !isset($foo) || !$fooi !emptyjest analogiczny do isset($foo) && $foo. Tzn. emptyRobi to odwrotnie, isseta dodatkowo sprawdza prawdziwość wartości.

Innymi słowy, emptyjest taki sam jak !$foo, ale nie rzuca ostrzeżeń, jeśli zmienna nie istnieje. To jest główny punkt tej funkcji: wykonaj porównanie boolowskie bez obawy o ustawienie zmiennej.

Instrukcja przedstawia to następująco:

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

Możesz po prostu użyć !empty($vars[1])tutaj.

deceze
źródło
7
Ale jeśli nie $vars[1]będzie, dostanie powiadomienie.
karim79
6
Nie mam pojęcia, skąd wziął się ten pomysł. Plus jeden.
karim79
8
@karim IMO emptyjest jedną z najbardziej niezrozumianych funkcji w PHP. Mały fragment o „generowaniu żadnego ostrzeżenia” jest bardzo łatwy do przeoczenia. Kilka razy musiałem zeskanować dokumentację, aby ją znaleźć i opublikować tutaj.
deceze
2
empty($vars[1])nie powoduje żadnych ostrzeżeń nawet $vars[1]nie jest ustawiony, ale echo $vars[1]będzie. Sprawdziłem fakt za pomocą echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;.
Amil Waduwawara,
4
@Shahor Wiele języków uważa 0za false. PHP nie jest jedynym. Nadal nie jestem pewien, na czym polega twoja skarga.
deceze
33

isset() sprawdza, czy zmienna jest ustawiona, a nie zerowa:

http://us.php.net/manual/en/function.isset.php

empty() może zwrócić true, gdy zmienna jest ustawiona na pewne wartości:

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

Aby to zademonstrować, wypróbuj następujący kod z nieprzypisanym $ the_var, ustaw na 0 i ustaw na 1.

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>
GreenMatt
źródło
12

Przyjęta odpowiedź jest nieprawidłowa.

isset () NIE jest równoważne z! empty ().

Jeśli pójdziesz tą drogą, stworzysz raczej nieprzyjemne i trudne do debugowania błędy. np. spróbuj uruchomić ten kod:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb

Snowcrash
źródło
7
Przyjęta odpowiedź w żaden sposób nie sugeruje, że issetjest to odpowiednik !empty.
deceze
8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}
rajmohan
źródło
1
Ale nie obsłużyłeś zmiennej nie ustawionej wielkości liter.
Amil Waduwawara,
3

Puste po prostu sprawdź, czy zmieniona / tablica ma wartość, jeśli sprawdzisz dokument php (pusty) zobaczysz, że te rzeczy są uważane za puste

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

while isset sprawdza, czy zmienna isset i nie jest pusta, co można również znaleźć w php doc (isset)

Breezer
źródło
2

To nie jest konieczne.

Jeśli zmienna nie istnieje, nie jest generowane ostrzeżenie. Oznacza to, że empty () jest w istocie zwięzłym odpowiednikiem! Isset ($ var) || $ var == false.

php.net

madlopt
źródło
2
Nie było to nigdy konieczne w żadnej wersji PHP, ponieważ puste już sprawdza (nie) ustawienie. Mylisz fakt, że pusty obsługuje teraz wyrażenia z pytaniem.
alxgb
To prawda, pięć lat później.
Lennon
2

isset($vars[1]) AND !empty($vars[1])jest równoważne z !empty($vars[1]).

Przygotowałem prosty kod, aby pokazać go empirycznie.

Ostatni wiersz jest niezdefiniowaną zmienną.

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

I kod

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

Niezdefiniowana zmienna musi być oceniana poza funkcją, ponieważ sama funkcja tworzy zmienną tymczasową w samym zakresie.

Tajni
źródło
0

„Pusty”: działa tylko na zmiennych. Pusty może oznaczać różne rzeczy dla różnych typów zmiennych (sprawdź instrukcję: http://php.net/manual/en/function.empty.php ).

„isset”: sprawdza, czy zmienna istnieje i sprawdza prawdziwą wartość NULL lub false. Można go rozbroić, wywołując „rozbroić”. Jeszcze raz sprawdź instrukcję.

Użycie jednego z nich zależy od używanego typu zmiennej.

Powiedziałbym, że bezpieczniej jest sprawdzić jedno i drugie, ponieważ przede wszystkim sprawdzasz, czy zmienna istnieje, a jeśli tak naprawdę nie jest NULL lub jest pusta.

Stuart
źródło
3
@szahn „bezpieczniej jest sprawdzić oba”, - jako programista możesz sprawdzić wszystko, co chcesz dla bezpieczeństwa. Ale jeśli kod jest redundantny, możesz być redundantny jako programista.
madlopt
0

jeśli używamy tej samej strony do dodawania / edycji za pomocą przycisku przesyłania, jak poniżej

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

wtedy nie powinniśmy używać

isset($_POST['edit_id'])

bcoz edit_idjest cały czas ustawiany bez względu na to, czy jest to strona dodawana, czy edytowana, zamiast tego należy użyć warunku poniżej

!empty($_POST['edit_id'])
diEcho
źródło
poprzedni post został przesłany bcoz i przez pomyłkę naciśnij Enter, oto moja kompletna odpowiedź ... po co głosować? :(
diEcho
0
  • Ze strony PHP, odnosząc się do empty()funkcji:

Zwraca, FALSEjeśli varma niepustą i niezerową wartość.

Dobrze wiedzieć. Innymi słowy, wszystko od NULL, 0do „” powróci TRUEpodczas korzystania z empty()funkcji.

  • Oto opis tego, co isset()zwraca funkcja:

Zwraca, TRUEjeśli varistnieje; FALSEInaczej.

Innymi słowy, tylko zmienne, które nie istnieją (lub zmiennych, o ściśle NULLwartości) powróci FALSEna isset()funkcji. Zwrócone zostaną wszystkie zmienne, które mają dowolny typ wartości, niezależnie od tego, czy jest 0to pusty ciąg tekstowy itp TRUE.

Ende
źródło