PHP: si (! $ valor) VS si (vacío ($ valor)). ¿Hay alguna diferencia?

2 minutos de lectura

Me preguntaba cuál es la diferencia entre los dos casos a continuación y cuál se recomienda.

$val = 0;

if (!$val) {
  //True
}

if (empty($val) {
  //It's also True
}

Avatar de usuario de Shi
Shi

Echa un vistazo a la Tabla de comparación de tipos de PHP.

Si revisa la tabla, notará que para todos los casos, empty($x) es lo mismo que !$x. Entonces todo se reduce a manejar variables no inicializadas. !$x crea un E_NOTICEmientras empty($x) no es.

  • +1. También tenga en cuenta que esto es lo mismo que != [boolean result of evaluating $val]por lo que la última columna de la primera tabla es principalmente lo que debería mirar.

    – más rockero

    22 de agosto de 2011 a las 0:16

  • Gracias, eso es lo que necesitaba saber. Entonces supongo que vacío ($ x) es el enfoque más seguro. Supongo que la diferencia es insignificante en cuanto a rendimiento, ¿verdad?

    – Bachx

    22 de agosto de 2011 a las 0:24


  • Tenga en cuenta que cuando se utiliza el valor vacío () en propiedades de objetos inaccesibles, se llamará al método de sobrecarga __isset, si se declara.

    – xdazz

    22 de agosto de 2011 a las 2:03

Si usa vacío y la variable nunca se configuró/creó, no se generará ninguna advertencia/error.

Avatar de usuario de Felix Kling
Félix Kling

Vamos a ver:

empty documentación:

Las siguientes cosas se consideran empty:

  • "" (una cadena vacía)
  • 0 (0 como un número entero)
  • 0.0 (0 como un flotador)
  • "0" (0 como una cadena)
  • NULL
  • FALSE
  • array() (una matriz vacía)
  • var $var; (una variable declarada, pero sin un valor en una clase)

Documentación booleana:

Al convertir a booleano, se consideran los siguientes valores FALSE:

  • el booleano FALSE sí mismo
  • el entero 0 (cero)
  • el flotador 0.0 (cero)
  • la cadena vacía, y la cadena "0"
  • una matriz con cero elementos
  • un objeto con cero variables miembro (solo PHP 4)
  • el tipo especial NULL (incluidas las variables no configuradas)
  • SimpleXML objetos creados a partir de etiquetas vacías

Parece que la única diferencia (con respecto al valor resultante) es cómo un SimpleXML se maneja la instancia. Todo lo demás parece dar el mismo resultado (si inviertes el reparto booleano, por supuesto).

  • Entonces, ¿cuál es la conclusión? De la lista, boolean parece ser la verificación más robusta…

    – Jason McCreary

    22 de agosto de 2011 a las 0:19

  • Esto es incorrecto. Una prueba rápida en el shell de PHP revela que empty manijas vacías SimpleXMLElement instancias como ! lo hace; es simplemente un error en el empty documentación que no se mencionan allí.

    –Mark Amery

    7 junio 2015 a las 22:19


  • Tengo que amar la duplicación de doc.

    – leonbloy

    23 de febrero de 2019 a las 19:43

¿Ha sido útil esta solución?