PHP ist null oder leer?


207

Ich habe eine Frage zu NULLPHP:

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

Warum sehe ich, dass null ist, wenn $aeine leere Zeichenfolge ist? Ist das ein Fehler?

Antworten:


347

Was Sie suchen ist:

if($variable === NULL) {...}

Beachten Sie die ===.
Bei der Verwendung ==behandelt PHP wie Sie NULL , false , 0 , die leere Zeichenfolge und leere Arrays als gleich.


13
Falsch, Ihre Bedingung stimmt nur mit nicht initialisiert und null überein $variable. Was Sie wollen, ist eigentlich: $variable == null(beachten Sie die ==)
Thomas LAURENT

6
@ThomasLAURENT, das war es, wonach das OP gesucht hatte. Sie fragten sich, warum == nulldie leere Zeichenfolge übereinstimmte und nicht nur null oder undefiniert.
Godwin

3
Oups mein Fehler, aber Ihr letzter Satz hat mich denken lassen, dass NULL, false, 0 und "" genau gleich waren, was falsch ist, entschuldigen Sie das Missverständnis.
Thomas LAURENT

3
@ James es ist ein beabsichtigtes Verhalten in PHP, es ist auch 2017 noch wahr und wird wohl noch lange wahr sein
Defrag

1
$a = ''ist leer string, falseist boolesch, $a = 0;ist eine ganze Zahl und nullist vom Typ null. Was OP sagt, ist, dass PHP sie als "gleich" im Wert fädelt, aber nicht als "gleich" im Typ. Eine strenge === Überprüfung prüft daher auch den Typ und schlägt fehl, wenn Sie andere verwenden. Aus diesem Grund sollten Sie bei Ihren Rückgabewerten konsistent sein. Wenn Sie normalerweise eine Zeichenfolge in einer Methode wie zurückgeben getName(), sollten Sie diese nicht erhalten, nullwenn sie leer ist, sondern eher eine leere Zeichenfolge $user->getName() === '' oder $user->getId() === 0oder $user->isActive === false. Vorgesehenes Verhalten!
Cagatay Ulubay

225

Wie in der folgenden Tabelle gezeigt, empty($foo)entspricht es $foo==nullund is_null($foo)hat die gleiche Funktion von $foo===null. Die Tabelle zeigt auch einige knifflige Werte bezüglich des nullVergleichs. (ϕ bezeichnet eine nicht initialisierte Variable.)

         empty    is_null 
         ==null  ===null  isset   array_key_exists
      ϕ |   T   |   T   |   F   |   F   
   null |   T   |   T   |   F   |   T   
     "" |   T   |   F   |   T   |   T   
     [] |   T   |   F   |   T   |   T
      0 |   T   |   F   |   T   |   T      
  false |   T   |   F   |   T   |   T   
   true |   F   |   F   |   T   |   T   
      1 |   F   |   F   |   T   |   T   
     \0 |   F   |   F   |   T   |   T   

Ich benutze empty()und is_null()funktioniert nie . Die Verwendung eines einfachen Vergleichs ist weniger mehrdeutig, schneller und sauberer. Insbesondere gibt es weniger passende geschweifte Klammern.

zB if($x==null || $y==null)vs.if(is_null($x) || is_null($y))


2
Fehlende "0" und "0.0" in der Tabelle. Sie machen die Dinge wirklich schwierig, besonders leer (). Deshalb vermeide ich die Verwendung von empty ().
datasn.io

1
@PHPst Basieren Sie auf der Tabelle, die Sie gezeigt haben. Wie lautet also der PHP-Code für das, was Sie als "einfachen Vergleich" bezeichnet haben?
Chetabahana

@hyip ==nullund ===null.
PHPst

Dies sollte die beste Antwort sein, viel vollständiger. Vielen Dank.
pgr

@PHPst Du hast gesagt, dass ein einfacher Vergleich weniger mehrdeutig ist. Können Sie bitte ein Beispiel für die Verwendung eines einfachen Vergleichs anstelle dieser NULL leer () usw. geben
Naeem Ul Wahhab

28

check ==vs.===

'' == NULLwürde true zurückgeben
0 == NULLwürde true zurückgeben
false == nullwürde true zurückgeben

wohingegen

'' === NULLwürde false zurückgeben
0 === NULLwürde false zurückgeben
false === NULLwürde false zurückgeben


Getestet und richtig. '' == null (true) while '' === null (false)
TheLegendaryCopyCoder

18

Nein, es ist kein Fehler. Schauen Sie sich die Tabelle Lose Vergleiche mit == (zweite Tabelle) an, die das Ergebnis des Vergleichs jedes Werts in der ersten Spalte mit den Werten in den anderen Spalten zeigt:

    TRUE    FALSE   1       0       -1      "1"     "0"     "-1"    NULL    array() "php"   ""

    [...]    

""  FALSE   TRUE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   TRUE

Siehe Dort können Sie , dass eine leere Zeichenkette ""verglichen mit false, 0, NULLoder ""nachgeben wahr.

Möglicherweise möchten Sie stattdessen is_null [docs] oder einen strengen Vergleich (dritte Tabelle) verwenden.


Die Tabelle der losen Vergleiche scheint darauf hinzudeuten, dass der Vergleich von 0 == "php" oder "php" == 0 beide wahr ergibt. Was ist da los?
Robert

1
@Robert: Eine Zeichenfolge, die nicht mit Ziffern beginnt, wird konvertiert, 0wenn sie in eine Zeichenfolge umgewandelt wird: codepad.org/qi40SG3E . Also (int)"php" == 0.
Felix Kling

@ Robert: Ich meinte "wenn auf eine Zahl gegossen " .
Felix Kling

12

Dies ist kein Fehler, sondern ein normales PHP-Verhalten. Dies geschieht, weil der ==Operator in PHP nicht nach Typ sucht.

'' == null == 0 == false

Wenn Sie auch überprüfen möchten, ob die Werte denselben Typ haben, verwenden Sie === stattdessen. Um diesen Unterschied eingehend zu untersuchen, lesen Sie bitte die offizielle Dokumentation .


8

Wenn Sie verwenden ==, behandelt PHP eine leere Zeichenfolge oder ein leeres Array als null. Um zwischen nullund zu unterscheiden empty, verwenden Sie entweder ===oderis_null . So:

if($a === NULL) oder if(is_null($a))


if ($ a === NULL)
Caster


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.