Warum sollten Sie sowohl isset () als auch! Empty () überprüfen?


269

Gibt es einen Unterschied zwischen issetund !empty. Wenn ich diese doppelte boolesche Prüfung durchführe, ist sie auf diese Weise korrekt oder redundant? und gibt es einen kürzeren Weg, um dasselbe zu tun?

isset($vars[1]) AND !empty($vars[1])

3
Es gibt eine schöne Tabelle über die Ergebnisse ihrer Verwendung mit verschiedenen Arten von Variablen (sie haben Unterschiede) hier: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton

Die offensichtlichen genauen Ergänzungen sind isset und is_null, aber! Leer deckt einige verschiedene ab. Es hängt alles von der Art der Daten ab, auf die Sie testen.
Jeff Clayton

Antworten:


419

Dies ist völlig überflüssig. emptyist mehr oder weniger Abkürzung für !isset($foo) || !$foound !emptyist analog zu isset($foo) && $foo. Dh emptymacht das Gegenteil von issetplus eine zusätzliche Überprüfung auf die Wahrhaftigkeit eines Wertes.

Mit anderen Worten, emptyist dasselbe wie !$foo, gibt jedoch keine Warnungen aus, wenn die Variable nicht vorhanden ist. Das ist der Hauptpunkt dieser Funktion: Führen Sie einen booleschen Vergleich durch, ohne sich Gedanken über die gesetzte Variable zu machen.

Das Handbuch drückt es so aus:

empty()ist das Gegenteil von (boolean) var, außer dass keine Warnung generiert wird, wenn die Variable nicht gesetzt ist.

Sie können einfach !empty($vars[1])hier verwenden.


7
Aber wenn es keine gibt, wird $vars[1]er benachrichtigt.
Karim79

6
Ich habe keine Ahnung, woher ich diese Idee habe. Plus man würde.
Karim79

8
@karim IMO emptyist eine der am meisten missverstandenen Funktionen in PHP. Der winzige Ausschnitt über "Es wird keine Warnung generiert" ist sehr leicht zu übersehen. Ich musste die Dokumentation einige Male selbst scannen, um sie zu finden und hier zu veröffentlichen.
Täuschung

2
empty($vars[1])verursacht keine Warnungen auch $vars[1]ist nicht gesetzt, wird aber echo $vars[1]. Ich habe die Tatsache mit überprüft echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;.
Amil Waduwawara

4
@ Shahor Viele Sprachen betrachten 0als false. PHP ist nicht der einzige. Ich bin mir immer noch nicht sicher, was Ihre Beschwerde ist.
Täuschung

33

isset() testet, ob eine Variable gesetzt und nicht null ist:

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

empty() kann true zurückgeben, wenn die Variable auf bestimmte Werte gesetzt ist:

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

Um dies zu demonstrieren, versuchen Sie den folgenden Code, wobei $ the_var nicht zugewiesen, auf 0 und auf 1 gesetzt ist.

<?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";
}
?>

12

Die akzeptierte Antwort ist nicht korrekt.

isset () entspricht NICHT ! empty ().

Sie werden einige ziemlich unangenehme und schwer zu debuggende Fehler erstellen, wenn Sie diesen Weg gehen. Versuchen Sie beispielsweise, diesen Code auszuführen:

<?php

$s = '';

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

?>

https://3v4l.org/J4nBb


7
Die akzeptierte Antwort deutet in keiner Weise darauf hin, dass dies issetgleichbedeutend ist mit !empty.
Täuschung

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';
}

1
Sie haben jedoch keine Variable behandelt, bei der kein Fall festgelegt wurde.
Amil Waduwawara

3

Nur leer prüfen, ob die referenzierte Variable / das referenzierte Array einen Wert hat. Wenn Sie das PHP-Dokument (leer) überprüfen, werden Sie feststellen, dass diese Dinge als leer gelten

* "" (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)

während isset prüfe ob die Variable isset und nicht null ist, die auch im php doc (isset) zu finden ist


2

Es ist nicht erforderlich.

Es wird keine Warnung generiert, wenn die Variable nicht vorhanden ist. Das bedeutet, dass empty () im Wesentlichen das prägnante Äquivalent zu! Isset ($ var) || ist $ var == false.

php.net


2
Dies war bei keiner PHP-Version erforderlich, da leer bereits nach (nicht) isset sucht. Sie verwechseln die Tatsache, dass leer jetzt Ausdrücke mit der Frage unterstützt.
Alxgb

Es ist erst fünf Jahre später wahr.
Lennon

2

isset($vars[1]) AND !empty($vars[1])ist äquivalent zu !empty($vars[1]).

Ich habe einfachen Code vorbereitet, um ihn empirisch darzustellen.

Die letzte Zeile ist eine undefinierte Variable.

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

Und Code

$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");

Undefinierte Variablen müssen außerhalb der Funktion ausgewertet werden, da die Funktion selbst eine temporäre Variable im Bereich selbst erstellt.


0

"Leer": Funktioniert nur mit Variablen. Leer kann für verschiedene Variablentypen unterschiedliche Bedeutungen haben (siehe Handbuch: http://php.net/manual/en/function.empty.php ).

"isset": Überprüft, ob die Variable vorhanden ist und ob ein wahrer NULL- oder ein falscher Wert vorliegt. Kann durch Aufrufen von "nicht gesetzt" deaktiviert werden. Überprüfen Sie noch einmal das Handbuch.

Die Verwendung eines der beiden Variablen hängt vom verwendeten Variablentyp ab.

Ich würde sagen, es ist sicherer, nach beiden zu suchen, da Sie zunächst prüfen, ob die Variable vorhanden ist und ob sie nicht wirklich NULL oder leer ist.


3
@szahn "sicherer für beide zu überprüfen", - Sie als Programmierer können alles überprüfen, was Sie für die Sicherheit wollen. Wenn Ihr Code jedoch redundant ist, können Sie als Programmierer redundant sein.
Madlopt

0

Wenn wir dieselbe Seite zum Hinzufügen / Bearbeiten über die Schaltfläche "Senden" wie unten verwenden

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

dann sollten wir nicht verwenden

isset($_POST['edit_id'])

bcoz edit_idwird ständig festgelegt, ob es sich um eine Seite zum Hinzufügen oder Bearbeiten handelt. Stattdessen sollten wir die unten stehende Bedingung verwenden

!empty($_POST['edit_id'])

Der vorherige Beitrag wurde eingereicht, weil ich versehentlich die Eingabetaste drücke. Hier ist meine vollständige Antwort. Warum abstimmen? :(
diEcho

0
  • Von der PHP-Website unter Bezugnahme auf die empty()Funktion:

Gibt zurück, FALSEwenn der varWert nicht leer und nicht Null ist.

Das ist gut zu wissen. Mit anderen Worten, bei Verwendung der Funktion wird alles von NULLbis 0nach "" zurückgegeben .TRUEempty()

  • Hier ist die Beschreibung dessen, was die isset()Funktion zurückgibt:

Gibt zurück, TRUEfalls varvorhanden; FALSEAndernfalls.

Mit anderen Worten, nur Variablen, die nicht existieren (oder Variablen mit strengen NULLWerten), werden FALSEfür die isset()Funktion zurückgegeben. Alle Variablen, die einen beliebigen Wert haben, sei es 0eine leere Textzeichenfolge usw., werden zurückgegeben TRUE.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.