¿Cuál es la diferencia entre is_null ($ var) y ($ var === null)?

83

¿Hay alguna diferencia entre esto ...

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

¿y esto?

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

¿Qué forma es mejor para verificar si una variable contiene nulo o no? ¿Hay casos extremos que deba conocer? (Inicializo todas mis variables, por lo que las variables inexistentes no son un problema).

kijin
fuente
5
Uno pensaría que el ===operador sería más rápido ya que no es una función explícita ... pero me sorprendió una o dos veces.
John Giotta

Respuestas:

30

Siempre que la variable esté inicializada (lo que indicó, aunque no estoy 100% seguro de si esto es importante en este contexto o no. Ambas soluciones pueden generar una advertencia si la variable no se definió), son funcionalmente iguales. ===Sin embargo, supongo que sería un poco más rápido, ya que elimina la sobrecarga de una llamada de función.

Realmente depende de cómo mire su condición.

===es para una estricta comparación de datos. NULL tiene solo un 'valor', por lo que esto funciona para comparar con NULL (que es una constante de PHP del 'valor' nulo)

is_null está comprobando que la variable sea del tipo de datos NULL.

Depende de usted cuál elija, de verdad.

Craige
fuente
2
Gracias por explicar la comparación por valor frente a la comparación por tipo.
kijin
4
Prefiero la is_nullvariante, porque es fácil de usar accidentalmente en == nulllugar de === null. Dado que == nulles lo mismo que empty(ver otra respuesta), esto introduce un mayor potencial de error del programador (especialmente de nivel junior y medio) que uno simple y legible is_null.
ryanm
101

es true

es false

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

Resumen: 🔸 ♦ ️🔸

  • empty es equivalente a ==null
  • is_null es equivalente a ===null
  • issetes inverso de is_nully===null
PHPst
fuente
12
Realmente amo esta mesa.
Cheok Yan Cheng
3
que podría hacer que la mesa un poco más clara que la primera columna nombrada $vpara representar alguna variable genérica, y luego los demás isset($v), is_null($v), $v===nully así sucesivamente
Brandin
@Brandin Gracias por la sugerencia. Siéntase libre de editar la respuesta.
PHPst
4
@Pacerier Dijo claramente que son equivalentes, por lo que no hay diferencia funcional.
PHPst
1
issetno se quejará de una variable indefinida, devolverá falso. Usar is_nullo === nullresultará en un aviso.
user1431317
17

Ambos son exactamente iguales, los uso is_nullporque hace que mi código sea más legible

Ish
fuente
3
y aunque === puede ser más rápido al principio, el optimizador de PHP debería remediar eso.
foo
10
Siento is_nullque en realidad es menos claro. Si bien puede leerse bien, $v === nullno deja dudas de que la comparación se realiza con semántica estricta, pero is_null($v)algunos programadores se preguntarán si utiliza semántica ===o ==.
cabra
4
@goat, ish1301, Además, is_nullpodría eliminarse o redefinirse por completo, mientras === nullque siempre funcionará.
Pacerier
@Pacerier aunque su ejemplo es interesante, la probabilidad de que alguien instale el paquete runkit pecl, luego lo configure para permitir eliminar funciones integradas y luego eliminar is_null, de todas las cosas, sin reemplazarlo con algo es muy cercano a cero, o nulo si prefieres. El único escenario en el que puedo pensar en el que una persona querría eliminar is_null es si quisieran cambiar el comportamiento de la comparación nula globalmente. Por ejemplo; devolver falso en lugar de verdadero para no establecido; En este caso, solo sería posible si el código se escribiera con is_null para empezar.
kaan_a
7

Si parece redundante que php tenga tantas funciones de tipo is_foo (), cuando solo puede usar operadores de comparación estándar, considere funciones llamadas programáticamente.

$arrayOfNullValues = array_filter($myArray, 'is_null');
cabra
fuente
$arrayWithoutNullValuesalmacenaría una matriz que solo tiene nullvalores, entonces.
PointedEars
5

Acabo de ejecutar un punto de referencia rápido, probando un millón de iteraciones de cada uno. is_nulltardó 8 segundos en completarse; === nulltomó 1.

Entonces, una llamada a is_nulles 0.000007s más lenta que una llamada a ===en mi computadora.

Encontraría algo más útil para optimizar.


Mi código:

<?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;
día solitario
fuente
1
Curiosamente, PHP / 7 parece haber abordado esto y el rendimiento ahora es casi idéntico; de hecho, is_null()es un poco más rápido en mi computadora bajo 7.1.9 Win32.
Álvaro González
@ ÁlvaroGonzález noté lo mismo. La diferencia es insignificante entre las dos funciones. (is_null: 0.54486592610677, === null: 0.7440135592506) a 10,000 operaciones. La prueba se ejecutó 30 veces y estos números son el promedio.
Justin E
1

Usaría la función PHP incorporada sobre la comparación de operadores cada vez.

Michael Irigoyen
fuente
0

is_null($var)es aproximadamente 14 veces más lento que $var===null... 37,8 ms frente a 2,6 ms.

Pero en realidad no sé por qué.

Floern
fuente
0

Una cosa que la gente a menudo olvida mencionar en esta discusión es que si lo que le interesa es la verificación de tipos estricta, is_nulllo ayudará a nunca cometer un error tipográfico en sus operadores de comparación (== vs ===).

Ogier Schelvis
fuente