2011-11-23 17 views
128

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.

Respuesta

233

Lo que estamos buscando es:

if($variable === NULL) {...} 

trata de PHP NULL, falsa, y la cadena vacía como iguales.

+4

Falso, su condición sólo coincide sin inicializar y nula '' '$ variable'''. Lo que realmente quieres es: '' '$ variable == null''' (ten en cuenta' ''==' '') –

+3

@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

+1

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. –

10

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.

15

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).

+0

La tabla de comparaciones sueltas parece sugerir que comparar 0 == "php" o "php" == 0 ambos arrojará verdadero. ¿Que esta pasando ahí? – Robert

+1

@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'. –

+0

@Robert: Quise decir * "cuando se envía a un ** número **" *. –

18

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

171

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 
+1

Falta "0" y "0.0" en la tabla. Hacen que las cosas sean realmente complicadas, especialmente empty(). Es por eso que evito usar empty(). –

+0

@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

+0

@hyip '== null'and' === null'. – PHPst

5

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))

+0

if ($ a === NULL) – Caster

Cuestiones relacionadas