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?

Erin Tucker
fuente

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.

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

PHPst
fuente
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

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

Felix Kling
fuente
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 .

Aurelio De Rosa
fuente
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))

dayuloli
fuente
if ($ a === NULL)
Lanzador el
6

PHP 7 isset () vs empty () vs is_null ()

ingrese la descripción de la imagen aquí

Foued MOUSSI
fuente