Tengo una pregunta sobre NULL
en PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
¿Por qué veo que es nulo cuando $a
es una cadena vacía? ¿Eso es un error?
Tengo una pregunta sobre NULL
en PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
¿Por qué veo que es nulo cuando $a
es una cadena vacía? ¿Eso es un error?
Respuestas:
Lo que estás buscando es:
if($variable === NULL) {...}
Tenga en cuenta el ===
.
Cuando el uso ==
, como lo hizo, PHP trata NULL , falsa , 0 , el vacío de cadena y vacíos matrices como iguales.
== null
hacía coincidir la cadena vacía y no solo nula o indefinida.
$a = ''
es un vacio string
, false
es un booleano, $a = 0;
es un entero y null
es de tipo null
. Lo que OP dice es que PHP los enhebrará como "iguales" en valor, pero no como "iguales" en tipo. Por lo tanto, una verificación estricta ===
también verificará el tipo y fallará si usa diferentes. Esa es la razón por la que debe ser consistente en sus valores de retorno. Si normalmente devuelve una cadena en un método como getName()
, no debería obtener null
cuando está vacío, sino más bien una cadena vacía $user->getName() === ''
o $user->getId() === 0
o $user->isActive === false
. Comportamiento previsto!
Como se muestra en la siguiente tabla, empty($foo)
es equivalente $foo==null
y is_null($foo)
tiene la misma función de $foo===null
. La tabla también muestra algunos valores difíciles con respecto a la null
comparación. (ϕ denota variables no inicializadas).
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
Nunca uso empty()
y is_null()
funciones. Usar una comparación simple es menos ambiguo, más rápido y más limpio. Particularmente habrá menos llaves para hacer juego.
por ejemplo if($x==null || $y==null)
vsif(is_null($x) || is_null($y))
==null
y ===null
.
comprobar ==
vs===
'' == NULL
devolvería verdadero
0 == NULL
devolvería verdadero
false == null
devolvería verdadero
donde como
'' === NULL
devolvería falso
0 === NULL
devolvería falso
false === NULL
devolvería falso
No, no es un error. Eche un vistazo a las comparaciones sueltas con == tabla (segunda tabla), que muestra el resultado de comparar cada valor en la primera columna con los valores en las otras columnas:
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
[...]
"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
Allí se puede ver que una cadena vacía ""
en comparación con false
, 0
, NULL
o ""
producirá cierto.
Es posible que desee utilizar is_null
[docs] o una comparación estricta (tercera tabla).
0
cuando se convierte en una cadena: codepad.org/qi40SG3E . Por lo tanto (int)"php" == 0
.
Esto no es un error, sino un comportamiento normal de PHP. Ocurre porque el ==
operador en PHP no verifica el tipo.
'' == null == 0 == false
Si también desea verificar si los valores tienen el mismo tipo, use ===
en su lugar. Para estudiar en profundidad esta diferencia, lea la documentación oficial .
Si lo usa ==
, php trata una cadena o matriz vacía como null
. Para hacer la distinción entre null
y empty
, use ===
o is_null
. Entonces:
if($a === NULL)
o if(is_null($a))
Uso empty
: http://php.net/manual/en/function.empty.php .
Ejemplo:
$a = '';
if(empty($a)) {
echo 'is empty';
}
$variable
. Lo que quiere es en realidad:$variable == null
(tenga en cuenta==
)