Tengo una pregunta extraña relación con PHP y NULL, consulte el siguiente código:php es nulo o está vacío?
$a = '';
if($a == NULL) {
echo 'is null';
}
¿Por qué veo es nulo? si $a
está vacío, ¿es eso un error? Gracias.
Tengo una pregunta extraña relación con PHP y NULL, consulte el siguiente código:php es nulo o está vacío?
$a = '';
if($a == NULL) {
echo 'is null';
}
¿Por qué veo es nulo? si $a
está vacío, ¿es eso un error? Gracias.
Lo que estamos buscando es:
if($variable === NULL) {...}
trata de PHP NULL, falsa, y la cadena vacía como iguales.
no es un error pero el comportamiento normal de PHP. Sucede porque el operador ==
en PHP no comprueba el tipo.
'' == null == 0 == false
Si quieres también para comprobar si los valores son del mismo tipo, utilice ===
lugar. Para estudiar en profundidad esta diferencia, lea el official documentation.
No, no es un error. Echar un vistazo a la (segunda tabla) Loose comparisons with == table, que muestra el resultado de la comparación de cada valor en la primera columna con los valores de 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 ""
serán verdaderos.
En su lugar, puede utilizar is_null
[docs] o una comparación estricta (tercera tabla).
La tabla de comparaciones sueltas parece sugerir que comparar 0 == "php" o "php" == 0 ambos arrojará verdadero. ¿Que esta pasando ahí? – Robert
@Robert: una cadena que no comienza con dígitos se convierte a '0' cuando se convierte a una cadena: http://codepad.org/qi40SG3E. Entonces '(int)" php "== 0'. –
@Robert: Quise decir * "cuando se envía a un ** número **" *. –
cheque ==
vs ===
'' == NULL
volvería cierto
0 == NULL
volvería cierto
false == null
volvería cierto
donde como
'' === NULL
volvería falsa
0 === NULL
haría return false
false === NULL
volvería falsa
Como se muestra en la siguiente tabla, empty($foo)
es equivalente a $foo==null
y is_null($foo)
tiene la misma función de $foo===null
. La tabla también muestra algunos valores complicados con respecto a la comparación null
. (φ denota una variable no inicializada).
Nunca utilizo las funciones empty()
y is_null()
. Usar la comparación simple es menos ambiguo, más rápido y más limpio.
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
Falta "0" y "0.0" en la tabla. Hacen que las cosas sean realmente complicadas, especialmente empty(). Es por eso que evito usar empty(). –
@PHPst Base en la tabla que has mostrado, ¿cuál es en realidad el código php de lo que llamas 'comparación simple'? – hyip
@hyip '== null'and' === null'. – PHPst
Si utiliza ==
, php trata a una cadena vacía o matriz como null
. Para hacer la distinción entre null
y empty
, use ===
o is_null
. Por lo tanto:
if($a === NULL)
o if(is_null($a))
if ($ a === NULL) – Caster
Falso, su condición sólo coincide sin inicializar y nula '' '$ variable'''. Lo que realmente quieres es: '' '$ variable == null''' (ten en cuenta' ''==' '') –
@ThomasLAURENT, eso es lo que el OP estaba buscando, se preguntaban por qué '== null 'estaba haciendo coincidir la cadena vacía y no solo nula o indefinida. – Godwin
Oups mi error, pero su última frase me llevó a pensar que NULL, falso, 0 y "" eran ** estrictamente ** iguales, lo que es incorrecto, disculpe el malentendido. –