PHP es nulo o vacío?


208

Tengo una pregunta sobre NULLen PHP:

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

¿Por qué veo que es nulo cuando $aes una cadena vacía? ¿Eso es un error?

Respuestas:


348

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.


13
Falso, su condición solo coincide con no inicializada y nula $variable. Lo que quiere es en realidad: $variable == null(tenga en cuenta ==)
Thomas LAURENT

66
@ThomasLAURENT, eso es lo que estaba buscando el OP, se preguntaban por qué == nullhacía coincidir la cadena vacía y no solo nula o indefinida.
Godwin

3
Oups mi error, pero su última oración me hizo pensar que NULL, false, 0 y "" eran estrictamente iguales, lo cual está mal, perdón por el malentendido.
Thomas LAURENT

3
@James es un comportamiento previsto en PHP, aún es cierto incluso en 2017 y supongo que será cierto durante mucho tiempo, supongo
desfragmentar

1
$a = ''es un vacio string, falsees un booleano, $a = 0;es un entero y nulles 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 nullcuando está vacío, sino más bien una cadena vacía $user->getName() === ''o $user->getId() === 0o $user->isActive === false. Comportamiento previsto!
Cagatay Ulubay

225

Como se muestra en la siguiente tabla, empty($foo)es equivalente $foo==nully is_null($foo)tiene la misma función de $foo===null. La tabla también muestra algunos valores difíciles con respecto a la nullcomparació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))


2
Faltan "0" y "0.0" en la tabla. Hacen las cosas realmente difíciles, especialmente vacías (). Por eso evito usar empty ().
datasn.io

1
@PHPst Base en la tabla que mostraste, entonces, ¿cuál es realmente el código php de lo que llamaste 'comparación simple'?
Chetabahana

@hyip ==nully ===null.
PHPst

Esta debería ser la respuesta principal, mucho más completa. Gracias.
pgr

@PHPst Dijiste que la comparación simple es menos ambigua. ¿Puede proporcionar un ejemplo de uso de una comparación simple en lugar de estos NULL empty () etc.
Naeem Ul Wahhab

28

comprobar ==vs===

'' == NULLdevolvería verdadero
0 == NULLdevolvería verdadero
false == nulldevolvería verdadero

donde como

'' === NULLdevolvería falso
0 === NULLdevolvería falso
false === NULLdevolvería falso


Probado y correcto. '' == nulo (verdadero) mientras que '' === nulo (falso)
TheLegendaryCopyCoder

18

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, NULLo ""producirá cierto.

Es posible que desee 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án verdadero. ¿Que esta pasando ahí?
Robert

1
@Robert: una cadena que no comienza con dígitos se convierte 0cuando se convierte en una cadena: codepad.org/qi40SG3E . Por lo tanto (int)"php" == 0.
Felix Kling

@Robert: quise decir "cuando se lanza a un número " .
Felix Kling

12

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 .


8

Si lo usa ==, php trata una cadena o matriz vacía como null. Para hacer la distinción entre nully empty, use ===o is_null. Entonces:

if($a === NULL) o if(is_null($a))


if ($ a === NULL)
Lanzador el


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.