2011-06-03 22 views
16

¡Solo una pregunta rápida, y estoy seguro que es realmente básica!PHP - Comprobando si el resultado es falso;

he el siguiente código:

function checkThings($foo, $bar) { 
    ... 
    if ($valid) { 
     return $results; 
    } else { 
     return false; 
    } 
} 

En el otro extremo de este momento estoy haciendo

$check = checkThings($foo, $bar); 
if ($check === false) { 
    echo "Error"; 
} else { 
    echo $check; 
} 

está escribiendo el siguiente a la misma?

$check = checkThings($foo, $bar); 
if (!$check) { 
    echo "Error"; 
} else { 
    echo $check; 
} 

¿Cuál es el método preferido si ambos son correctos?

Gracias :)

Respuesta

41

El operador de triple igualdad es sensible al tipo. Así que cuando se compruebe:

if ($check === false) 

... sólo será verdadera si $check es el valor booleano "falsa". Wheras

if ($check == false) 

... no está comprobando específicamente para booleano falso, pero un valor "falsey". Falso, en PHP, es igual a cero, null es "falsey", como una cadena vacía ("" == false == null, pero "" !== false !== null). Entonces:

$check = 0; 
if ($check == false) 

... evalúa a verdadero.

El operador de prefijo ! es equivalente a ==. Entonces, cuando cero necesita ser un valor discreto de booleano falso, los operadores ! y == no son suficientes.

Mira la documentación para operadores de comparación aquí: http://php.net/manual/en/language.operators.comparison.php

Es una buena práctica para hacer sus comprobaciones condicionales lo más específico posible. Esto no es solo para evitar posibles descuidos en su lógica, sino también para hacer que el código sea más fácil de mantener para futuros desarrolladores.Imagínese encontrarse con una línea de código como este:

if (check_something($variable)) { 
    // do stuff 
} 

puedo asumir la función check_something devuelve un valor booleano verdadero. Pero, a menos que vaya a desenterrar la función check_something, podría también devolver una cadena no vacía, un número ... ¡quién sabe! Mucho más clara para hacer esto:

if (check_something($variable) === true) { 
    // do stuff 
} 

Ahora, con sólo mirar, sé que la función check_something es espera para devolver un valor verdadero. Puede que no sepa lo que hace la función, pero al menos está exactamente claro qué devuelve. Otro ejemplo común que se ve en TODAS PARTES:

if (!$_GET['value']) { 
    // do something 
} 

Esto es un fastidio de las mascotas. Una declaración condicional siempre debe estar comparando las cosas claramente. Por lo tanto, te gustaría hacer:

if (array_key_exists('value', $_GET) !== false && $_GET['value'] === '1') { 
    // do something 
} 

Ahora, se puede decir que yo no sólo estoy comprobando para ver si existe el parámetro de cadena de consulta, sino también si es igual a un valor específico.

En resumen, el único operador de prefijo ! y el operador == rara vez son útiles y siempre ambiguos. Le conviene escribir su código de una manera que se documente, o que se pueda traducir al lenguaje humano para expresar la lógica en juego. Una comparación directa con !== o ===, según corresponda, es un buen hábito, una buena práctica y la menos probable de producir resultados inesperados en su código.

+1

Por cierto, este es un problema específico de 'php' (y tal vez otros lenguajes flojos), debido a su extrema disposición a convertir automáticamente valores de un tipo a otro. En los lenguajes fuertemente tipados (por ejemplo, Java, C#, C++), la mayoría de los programadores prefieren la sintaxis concisa, como '! Value' (" not value ") en lugar de' value == false' o 'value === false'. En esos idiomas, el compilador se quejará si 'value' no es de tipo booleano, por lo que la forma concisa es segura. '" not value "' tiene un significado claro, tanto en lógica como en lenguaje humano; es solo la "soltura" de 'php' lo que hace que esta forma sea pobre de usar. – ToolmakerSteve

+0

^y javascript en cierta medida –

4

Son similares, pero no exactamente lo mismo. El !$check es un comprobador suelto, lo que significa 0 y null también evaluaría a verdadero. El === es un comprobador estricto, lo que significa que debe ser false.

Para una explicación más en profundidad: (! $ Cheque) PHP Types Comparisons

7

=== cheques falsos tipo, evalúa el valor y se producirá un error para los valores devueltos tales como nulo '' (cadena vacía) y cero (0)

=== es más correcto

-1

== hace una comparación de valor donde === hace un bit a bit.

// will return true only when $value = false 
if($value === false) 

// will return true when $value = 0, $value = "", $value = null, etc 
if($value == false) 
if(!$value) 
+1

'===' compara el valor y el tipo de las 2 cosas. No es 'bitwise'. –

+0

Estoy de acuerdo con @Rocket: esto es incorrecto –

+0

Es la primera vez que escucho sobre 'bitwise' con respecto al operador ===. Más información podría ser útil. – JohnnyQ

0

Preferiría su segundo método, pero coloque primero el positivo (si ($ check) en su lugar).

+0

Esto no funcionaría por las mismas razones que con '! $ Check'. Él realmente debería usar '$ check! == FALSE'. –

Cuestiones relacionadas