Was ist der Unterschied zwischen is_null ($ var) und ($ var === null)?

83

Gibt es einen Unterschied zwischen diesem ...

if (is_null($var)) {
    do_something();
}

und das?

if ($var === null) {
    do_something();
}

Welches Formular ist besser, wenn überprüft wird, ob eine Variable null enthält oder nicht? Gibt es Randfälle, die mir bekannt sein sollten? (Ich initialisiere alle meine Variablen, sodass nicht vorhandene Variablen kein Problem darstellen.)

Kijin
quelle
5
Sie würden denken, der ===Operator wäre schneller, da es sich nicht um eine explizite Funktion handelt ... aber ich war ein- oder zweimal überrascht.
John Giotta

Antworten:

30

Vorausgesetzt, die Variable ist initialisiert (was Sie angegeben haben - obwohl ich nicht 100% sicher bin, ob dies in diesem Zusammenhang von Bedeutung ist oder nicht. Beide Lösungen geben möglicherweise eine Warnung aus, wenn die Variable nicht definiert wurde), sind sie funktional identisch. Ich gehe ===jedoch davon aus, dass dies geringfügig schneller sein würde, da dadurch der Overhead eines Funktionsaufrufs entfällt.

Es hängt wirklich davon ab, wie Sie Ihren Zustand betrachten.

===ist für einen strengen Datenvergleich. NULL hat nur einen 'Wert', daher funktioniert dies für den Vergleich mit NULL (was eine PHP-Konstante des Nullwerts 'ist').

is_null prüft, ob die Variable vom Datentyp NULL ist.

Es liegt wirklich an Ihnen, welche Sie wählen.

Craige
quelle
2
Vielen Dank für die Erklärung von Vergleich nach Wert und Vergleich nach Typ.
Kijin
4
Ich bevorzuge die is_nullVariante, weil es einfach ist, versehentlich == nullstatt zu verwenden === null. Da dies == nulldasselbe ist wie empty(siehe andere Antwort), führt dies zu einem größeren Fehlerpotential für Programmierer (insbesondere Junior- und Mid-Level-Fehler) als ein einfacher und lesbarer Fehler is_null.
Ryanm
100

ist true

ist false

        | isset   | is_null | ===null | ==null  | empty   |
|-------|---------|---------|---------|---------|---------|
|  null |       |       |       |      |       |
|  true |       |       |       |      |       |
| false |       |       |       |      |       |
|     0 |       |       |       |      |       |
|     1 |       |       |       |      |       |
|    \0 |       |       |       |      |       |
| unset |       |       |       |      |       |
|   ""  |       |       |       |      |       |

Zusammenfassung: 🔸 ♦ ️🔸

  • empty ist äquivalent zu ==null
  • is_null ist äquivalent zu ===null
  • issetist umgekehrt zu is_nullund===null
PHPst
quelle
12
Ich liebe diesen Tisch wirklich.
Cheok Yan Cheng
3
es könnte der Tisch etwas deutlich machen , die erste Spalte mit dem Namen haben $veinige generische Variable darzustellen, und dann die anderen isset($v), is_null($v), $v===nullund so weiter
Brandin
@Brandin Danke für den Vorschlag. Fühlen Sie sich frei, die Antwort zu bearbeiten.
PHPst
4
@ Pacerier Es wurde klar gesagt, dass sie gleichwertig sind, so dass es keinen funktionalen Unterschied gibt.
PHPst
1
issetbeschwert sich nicht über eine undefinierte Variable, sondern gibt false zurück. Die Verwendung von is_nulloder === nullführt zu einem Hinweis.
user1431317
17

Beide sind genau gleich, ich benutze, is_nullweil es meinen Code besser lesbar macht

Ish
quelle
3
und während === zunächst schneller sein kann, sollte der PHP-Optimierer Abhilfe schaffen.
foo
10
Ich fühle mich is_nulleigentlich weniger klar. Es mag zwar gut lesen, $v === nulllässt aber keinen Zweifel daran, dass der Vergleich mit strenger Semantik durchgeführt wird, aber mit is_null($v)werden sich einige Codierer fragen, ob es verwendet wird ===oder ==Semantik.
Ziege
4
@goat, ish1301, Auch is_nullkönnte entfernt oder komplett neu definiert werden, während === nullimmer funktioniert.
Pacerier
@Pacerier, während Ihr Beispiel interessant ist, ist die Wahrscheinlichkeit, dass jemand das Runkit-Pecl-Paket installiert, es dann so einrichtet, dass integrierte Funktionen entfernt und dann ausgerechnet is_null entfernt werden, ohne es durch etwas zu ersetzen, sehr nahe bei null oder null, wenn Sie bevorzugen. Das einzige Szenario, in dem ich mir vorstellen kann, wo eine Person is_null entfernen möchte, ist, wenn sie das Verhalten des Nullvergleichs global ändern möchte. Beispielsweise; Rückgabe von false anstelle von true für unset; In diesem Fall wäre es eigentlich nur möglich, wenn der Code zunächst mit is_null geschrieben würde.
kaan_a
7

Wenn es für PHP überflüssig erscheint, so viele Funktionen vom Typ is_foo () zu haben, sollten Sie programmgesteuert aufgerufene Funktionen in Betracht ziehen, wenn Sie nur Standardvergleichsoperatoren verwenden können.

$arrayOfNullValues = array_filter($myArray, 'is_null');
Ziege
quelle
$arrayWithoutNullValueswürde dann ein Array speichern, das nur null Werte hat.
PointedEars
5

Ich habe gerade einen schnellen Benchmark durchgeführt und jeweils eine Million Iterationen getestet. is_nulldauerte 8 Sekunden; === nullnahm 1.

Ein Anruf bei is_nullist also 0,000007 Sekunden langsamer als ein Anruf ===auf meinem Computer.

Ich würde etwas Nützlicheres finden, um es zu optimieren.


Mein Code:

<?php

$start = time();
$var = null;

for ($i = 1000000; $i--; ) {
    is_null($var);
}

echo time() - $start;

$start = time();

for ($i = 1000000; $i--; ) {
    $var === null;
}

echo time() - $start;
einsamer Tag
quelle
1
Interessanterweise scheint PHP / 7 dies behoben zu haben, und die Leistung ist jetzt nahezu identisch. in der Tat is_null()ist in meinem Computer unter 7.1.9 Win32 etwas schneller.
Álvaro González
@ ÁlvaroGonzález Mir ist das Gleiche aufgefallen. Der Unterschied zwischen den beiden Funktionen ist vernachlässigbar. (is_null: 0.54486592610677, === null: 0.7440135592506) bei 10.000 Operationen. Der Test wurde 30 Mal durchgeführt, und diese Zahlen sind der Durchschnitt.
Justin E
1

Ich würde die eingebaute PHP-Funktion jedes Mal über den Operatorvergleich verwenden.

Michael Irigoyen
quelle
0

is_null($var) ist etwa 14 mal langsamer als $var===null ... 37,8 ms gegenüber 2,6 ms.

Aber eigentlich weiß ich nicht warum.

Floern
quelle
0

Eine Sache, die die Leute in dieser Diskussion oft vergessen zu erwähnen, ist, dass Sie, wenn Sie sich ausschließlich mit strenger Typprüfung beschäftigen, is_nullin Ihren Vergleichsoperatoren niemals einen Tippfehler machen können (== vs ===).

Ogier Schelvis
quelle