if ($ val) vs. if ($ val!="") vs. if (! leer ($ val)) - welche?

8

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?

    
Avicinnian 12.09.2011, 08:05
quelle

6 Antworten

16

Unterschied zwischen freiem Test und Vergleich mit leerer Zeichenfolge

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:

  • Wenn $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)
  • Wenn $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 )
  • Wenn $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 .

Der bessere Weg zum Testen

Die bevorzugte Methode zum Testen ist false , was nicht genau so ist wie oben:

  1. Es leidet nicht unter den Inkonsistenzen von if(!empty($foo)) (was IMHO einfach schrecklich ist).
  2. Es wird kein 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.

Manchmal müssen Sie mit dem identischen Operator

testen

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(...)) .

    
Jon 12.09.2011, 08:09
quelle
4

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 {...}

    
thwd 12.09.2011 08:08
quelle
0

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%     
Emil Vikström 12.09.2011 08:10
quelle
0

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 Strings ( "" ), leere Arrays ( array() ), null ( 0 ) und boolean false ( false ) werden als false behandelt
  • alles andere ( "foo" , 1 , array('foo') , true , ...) wird als true behandelt

BEARBEITEN:
Weitere Informationen finden Sie in den Vergleichstabellen .

    
oezi 12.09.2011 08:10
quelle
0

empty ($ foo) sollte in all diesen Fällen true zurückgeben: 0, "", NULL.

Eine vollständige Liste finden Sie auf dieser Seite: Ссылка

    
Johannes 12.09.2011 08:10
quelle
0

Nein, es ist nicht gleich. Wenn die Variable nicht definiert ist, generiert Ausdruck ohne empty eine Meldung über nicht definierte Variable.

    
OZ_ 12.09.2011 08:12
quelle

Tags und Links