2009-05-10 17 views
6

¿Hay alguna diferencia de velocidad entre¿Qué es mejor, isset o no?

if (isset($_POST['var'])) 

o

if ($_POST['var']) 

Y lo que es mejor o son lo mismo?

+4

Claramente, toma más tiempo escribir isset():/ –

+0

Solo me preguntaba si había alguna razón real por la que sería necesario en este caso. Supongo que no – James

Respuesta

17

Es una buena práctica utilizar isset por las siguientes razones:

  • Si $_POST['var'] es una cadena vacía o "0", isset seguirá habiendo detectar que existe la variable.
  • No usar isset generará un aviso.
13

No son lo mismo. Considere una matriz teórica:

$arr = array(
    'a' => false, 
    'b' => 0, 
    'c' => '', 
    'd' => array(), 
    'e' => null, 
    'f' => 0.0, 
); 

Suponiendo $x es una de esas teclas ('a' a 'f') y la 'g' llave que no está allí funciona así:

  • $arr[$x] es false para todas las teclas de la a la g;
  • isset($arr[$x]) es true para las teclas a, b, c, d y f pero false para e y g; y
  • array_key_exists($x, $arr) es true para todas las teclas a a f, false para g.

Sugiero que mire PHP's type juggling, específicamente la conversión a booleanos.

Por último, lo que estás haciendo se llama micro-optimization. Nunca elija cuál de ellos por lo que se perciba como más rápido. Cualquiera que sea más rápido es tan insignificante en la diferencia que debería ser nunca ser un factor incluso si pudiera determinar de manera confiable cuál es más rápido (que no estoy seguro de que pueda hacerlo a ningún nivel estadísticamente significativo).

+0

cletus tiene razón; una consulta SQL será mil veces más lenta que mil comprobaciones de isset. También vale la pena señalar que if ($ arr ['g']) generará una E_NOTICE "variable no definida". – Shabbyrobe

4

isset prueba que la variable tiene algún valor, mientras que el si prueba el valor de la variable.

Por ejemplo:

// $_POST['var'] == 'false' (the string false) 
if (isset($_POST['var'])) { 
    // Will enter this if 
} 
if ($_POST['var']) { 
    // Won't enter this one 
} 

El gran problema es que la equivalencia de las dos expresiones depende del valor de la variable que se está mirando, por lo que no puede hacer suposiciones.

+0

Tengo la sensación de que necesita una pequeña corrección en la primera línea. isset no "prueba que la variable tiene ningún valor", prueba si se ha instanciado/creado '$ a = ''; isset ($ a); 'evaluará a verdadero. –

1

En PHP estricto, debe comprobar si se establece una variable antes de usarla.

error_reporting(E_ALL | E_STRICT); 

Lo que está haciendo aquí

if ($ var)

no comprueba si se ha establecido el valor. Así que PHP estricto generará un aviso para las variables no establecidas.(Esto sucede mucho con las matrices)

También en PHP estricto (solo un FYI para usted u otros), usar un unset var como argumento en una función arrojará un aviso y no se puede verificar isset() dentro de la función para evitar eso.

+0

Esto no es completamente correcto. E_STRICT no tiene nada que ver con un aviso lanzado en este caso. Incluso si E_STRICT está desactivado, todavía se emite un aviso. – Matt

+0

¿Quiere decir en el código o archivo de registro? Porque necesita habilitar E_STRICT en php.ini para que se lance (antes de PHP 6) –

0

simplemente repetir lo que otros dijeron, si se ejecuta:

if($variable) 

y $ variable es no conjunto, obtendrá un error de aviso. Además ...

$var = 0; 
if($variable) { 
    //This code will never run, because $var is false 
} 

pero usando isset devolvería verdadero en este caso.