vacia - is_null($ x) vs $ x=== null en PHP
php is null or empty (7)
Posible duplicado:
¿Cuál es la diferencia entre is_null ($ var) y ($ var === null)?
PHP tiene dos (que yo sepa, y tres si cuenta isset()
) para determinar si un valor es nulo: is_null()
y === null
. He escuchado, pero no confirmado, que === null
es más rápido, pero en una revisión del código, alguien sugirió fuertemente que use is_null()
ya que está diseñado específicamente para el propósito de la evaluación nula. Él también comenzó a hablar sobre matemáticas o algo así.
De todos modos, el hecho de que is_null()
sea aparentemente más lento también me lleva a creer que está haciendo más de === null
y probablemente sea el preferido. ¿Hay alguna razón para usar uno u otro? ¿Siempre se prefiere uno? ¿Qué pasa con isset()
?
Como un apéndice para posiblemente no cerrar esta pregunta, ¿qué pasa con isset()
vs. is_null()
? Parece que todo lo que isset()
hará es suprimir el aviso, por lo tanto, a menos que realmente desee un aviso para una variable indefinida, ¿hay alguna razón para usar is_null()
lugar? ¿Qué tal si sabes que la variable se inicializa en el momento?
Finalmente, ¿hay alguna razón matemática para preferir is_null()
sobre === null
? ¿Algo sobre null no es comparable?
La documentación de PHP tiene una buena discusión y experimentos sobre is_null, === null, isset
. Lea especialmente la sección de comentarios.
Necesitas isset()
si la variable posiblemente no está definida. Devuelve falso cuando la variable no está definida o === null
(sí, es así de feo). Solo isset()
y empty()
no generan un E_NOTICE si la variable o el elemento de matriz no existe.
Realmente no hay una diferencia entre is_null
y === null
. Creo que ===
es mucho mejor, pero cuando, por ejemplo, necesitas usar call_user_func
por algún motivo dudoso, deberías usar is_null
.
No hay absolutamente ninguna diferencia en la funcionalidad entre is_null
y === null
.
La única diferencia es que is_null
es una función y por lo tanto
- es marginalmente más lento (sobrecarga de llamada de función)
- se puede usar como una devolución de llamada, por ejemplo
array_map(''is_null'', $array)
.
Personalmente, utilizo null ===
siempre que puedo, ya que es más consistente con false ===
verificaciones false ===
y true ===
.
Si lo desea, puede verificar el código: is_identical_function
( ===
) y php_is_type
( is_null
) hacen lo mismo para el caso IS_NULL
.
El constructo de lenguaje isset()
relacionado verifica si la variable realmente existe antes de realizar la verificación null
. Entonces isset($undefinedVar)
no lanzará un aviso.
También tenga en cuenta que isset()
algunas veces puede devolver true
aunque el valor sea null
: este es el caso cuando se usa en un objeto sobrecargado, es decir, si el objeto define un método offsetExists
/ __isset
que devuelve true
incluso si el desplazamiento es null
( esto es realmente bastante común, porque las personas usan array_key_exists
en offsetExists
/ __isset
).
No puedo decir si es mejor usar is_null
o === null
. Pero tenga isset
al usar isset
en matrices.
$a = array(''foo'' => null);
var_dump(isset($a[''foo''])); // false
var_dump(is_null($a[''foo''])); // true
var_dump(array_key_exists(''foo'', $a)); // true
Según lo manifestado por otros, hay una diferencia de tiempo entre el uso de ===
y is_null()
. Hizo algunas pruebas rápidas y obtuvo estos resultados:
<?php
//checking with ===
$a = array();
$time = microtime(true);
for($i=0;$i<10000;$i++) {
if($a[$i] === null) {
//do nothing
}
}
echo ''Testing with === '', microtime(true) - $time, "/n";
//checking with is_null()
$time = microtime(true);
for($i=0;$i<10000;$i++) {
if(is_null($a[$i])) {
//do nothing
}
}
echo ''Testing with is_null() '', microtime(true) - $time;
?>
Da los resultados
Probando con === 0.0090668201446533
Probando con is_null () 0.013684034347534
Todos tienen su lugar, aunque solo isset () evitará advertencias variables indefinidas:
$ php -a
Interactive shell
php > var_dump(is_null($a));
PHP Notice: Undefined variable: a in php shell code on line 1
bool(true)
php > var_dump($a === null);
PHP Notice: Undefined variable: a in php shell code on line 1
bool(true)
php > var_dump(isset($a));
bool(false)
php >
===
y is_null
es lo mismo.
Según este comentario, is_null
es solo 250ns más lento. Creo que porque una función es más lenta que un operador.