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.
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
^y javascript en cierta medida –