Ich sehe eine Menge Leute, die eine Vielzahl verschiedener Methoden verwenden, um zu überprüfen, ob eine Variable leer ist, es scheint wirklich keinen Konsens zu geben. Ich habe gehört, dass if($foo)
genau dasselbe ist wie if(!empty($foo))
oder if($foo != "")
. Stimmt das?
Ich verstehe, dass es eine wirklich einfache Frage ist, aber ich würde es gerne wissen. Gibt es Unterschiede? Welche Methode sollte ich verwenden?
if($foo != "")
entspricht in den meisten Fällen if($foo)
, aber nicht immer .
Um zu sehen, wo die Unterschiede liegen, betrachten Sie das Vergleichsoperatorverhalten zusammen mit Umwandlung in Zeichenfolgenregeln für den ersten Fall und < a href="http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting"> Umwandlung in boolesche Regeln für den zweiten Fall.
Was ich herausgefunden habe ist:
$foo === array()
, der if($foo != "")
Test erfolgreich ist (Arrays sind "größer als" Strings), aber der if($foo)
Test wird fehlschlagen (leere Arrays werden in boolean false
konvertiert) $foo === "0"
(eine Zeichenkette), der if($foo != "")
Test wird wieder erfolgreich sein, aber der if($foo)
Test wird fehlschlagen (die Zeichenkette "0"
konvertiert in boolean false
) $foo
ein SimpleXML-Objekt ist, das aus einem leeren Tag erstellt wurde, ist der if($foo != "")
-Test erneut erfolgreich (Objekte sind "größer als" Strings), aber der if($foo)
-Test wird fehlschlagen (solche Objekte werden in boolean% konvertiert) co_de%) Sehen Sie die Unterschiede in der Aktion .
Die bevorzugte Methode zum Testen ist false
, was nicht genau so ist wie oben:
if(!empty($foo))
(was IMHO einfach schrecklich ist). if($foo != "")
generiert, wenn E_NOTICE
nicht im aktuellen Bereich vorhanden ist. Dies ist der Hauptvorteil gegenüber $foo
. Allerdings gibt es hier eine Einschränkung: Wenn if($foo)
(eine Zeichenkette der Länge 1), dann wird $foo === '0'
empty($foo)
zurückgeben, was normalerweise (aber nicht immer sein kann) was du willst . Dies ist auch bei true
der Fall.
Schließlich muss eine Ausnahme zu dem obigen gemacht werden, wenn es einen bestimmten Werttyp gibt, für den Sie testen möchten. Beispielsweise könnte if($foo)
strpos
zurückgeben und auch 0
zurückgeben. Beide Werte werden den Test false
nicht bestehen, aber sie haben völlig unterschiedliche Bedeutungen. In diesen Fällen ist ein Test mit dem identischen Operator in der Reihenfolge: if(strpos(...))
.
Nein, das stimmt nicht immer. Wenn Sie if($foo)
PHP verwenden, wird die Variable auf Boolean umgestellt. Eine leere Zeichenfolge, eine Null-Ganzzahl oder ein leeres Array ist dann false
. Manchmal kann dies ein Problem sein.
Sie sollten immer versuchen, den genauesten Vergleich zu verwenden, wenn Sie eine Zeichenfolge erwarten, die leer sein könnte. if($foo==='')
verwenden (beachten Sie die drei Gleichheitszeichen). Wenn Sie entweder (boolean) false oder eine Ressource (z. B. von einer DB-Abfrage) erwarten, verwenden Sie if($foo===false){...} else {...}
Sie können die Dokumentation zum Casting auf boolean lesen um die Antwort auf diese Frage zu finden. Dort ist eine Liste mit Werten, die in true
bzw. false
konvertiert werden.
Beachten Sie, dass empty auch prüft, ob die Variable gesetzt ist, was im regulären Vergleich nicht der Fall ist. Eine nicht gesetzte Variable löst beim Vergleich einen Fehler vom Typ E_NOTICE aus, nicht jedoch bei Verwendung von leer. Sie können dies umgehen, indem Sie den iset Aufruf vor Ihrem Vergleich verwenden, wie folgt:
%Vor% if()
"konvertiert" die Anweisung, die einem bool gegeben wurde, also schaut euch die Dokumentation an boolean scheint genau das zu sein, wonach du suchst. allgemein:
""
), leere Arrays ( array()
), null ( 0
) und boolean false ( false
) werden als false
behandelt
"foo"
, 1
, array('foo')
, true
, ...) wird als true
behandelt
BEARBEITEN:
Weitere Informationen finden Sie in den Vergleichstabellen .
Tags und Links php if-statement