2011-08-22 44 views
12

Me preguntaba ¿cuál es la diferencia de los dos casos siguientes, y cuál se recomienda?

$val = 0; 

if (!$val) { 
    //True 
} 

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

Respuesta

21

Eche un vistazo a PHP type comparison table.

Si consulta la tabla, observará 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_NOTICE, mientras que empty($x) no lo hace.

+0

+1. También tenga en cuenta que esto es lo mismo que '! = [Resultado booleano de la evaluación de $ val]', por lo que la última columna de la primera tabla es principalmente lo que debería estar mirando. – rockerest

+0

+1 Buen hallazgo en la tabla de comparación. –

+0

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

4

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

3

Vamos a ver:

empty documentation:

Los siguientes factores son considerados como empty:

  • "" (una cadena vacía)
  • 0 (0 como un 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)

Booleans documentation:

Al convertir a boolean, los siguientes valores son considerados FALSE:

  • el booleano FALSE
  • el número entero 0 (cero)
  • el flotador 0.0 (cero)
  • la cadena vacía, y la cadena "0"
  • una matriz con elementos cero
  • un objeto con variables cero miembro (PHP 4 solamente)
  • el tipo especial NULL (incluyendo variables no definidas)
  • SimpleXML objetos creados a partir de etiquetas vacías

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

+0

Entonces, ¿cuál es la conclusión? De la lista, boolean parece el control más robusto ... –

+0

Esto es incorrecto. Una prueba rápida en el shell PHP revela que 'empty' maneja instancias' SimpleXMLElement' vacías al igual que '!' Does; es simplemente un error en la documentación 'vacía' que no se mencionan allí. –