2010-06-21 12 views
9

Hoy solo lo he notado y he descubierto la importancia de usar === operador. Se puede ver en el siguiente ejemplo:¡La importancia de usar === en lugar de == en php!

$var=0; 
if ($var==false) echo "true"; else echo "false"; //prints true 
$var=false; 
if ($var==false) echo "true"; else echo "false"; //prints true 
$var=0; 
if ($var===false) echo "true"; else echo "false"; //prints false 
$var=false; 
if ($var===false) echo "true"; else echo "false"; //prints true 

La cuestión es que, ¿hay situaciones en las que es importante utilizar === operador en lugar de utilizar == operador?

+4

Se podía decir 'echo $ var == false;' etc. – Skilldrick

+1

Ver http://stackoverflow.com/questions/1117967/what-does-mean – ChrisF

+0

@Chris. Ya he visto esa pregunta. Pero mi pregunta es sobre ejemplos, donde es realmente importante considerar usar el operador "===", no el operador "==". – Bakhtiyor

Respuesta

13

Por supuesto, sólo un ejemplo: array_search()

Advertencia

Esta función puede devolver Boolean FALSE, pero también puede devolver un valor no-booleano que será evaluado FALSE, como 0 o "". Lea la sección sobre Booleanos para más información. Use el operador === para probar el valor de retorno de esta función.

Básicamente si se utiliza cualquier función que devuelve un valor en caso de éxito, pero FALSE en caso de fallo, usted debe comprobar el resultado con === para estar seguro (de lo contrario ¿por qué habría un cuadro de advertencia rojo grande;))


Otros ejemplos: next(), current()
o funciones de cadena como también se menciona como strpos(), stripos(), etc.

Incluso substr() aunque no se menciona explícitamente:

Devuelve la parte extraída de la cadena en caso de fallo.

¿Pero y si la parte extraída es "0"? También evalúa a FALSE, pero no es un error.

+1

'next' y' current' no son buenos ejemplos. ¿Qué sucede si hay valores * false * como en 'array (false)'? – Gumbo

+1

@Gumbo: Eso es correcto. Acabo de mencionarlos porque también tienen este recuadro de advertencia en su documentación. Pero hay una nota (que debería ser más enfatizada en mi humilde opinión): * Nota: No podrá distinguir el final de una matriz de un elemento booleano FALSO. Para atravesar adecuadamente una matriz que puede contener elementos FALSOS, consulte la función cada(). * –

3

El === es strict type comparison operador, no sólo se comprobará valores, sino también su tipo mientras == sólo comprueba si o no valores son los mismos.

Considérese una situación en la que se compara números o cadenas:

if (4 === 4) // same type and value 
{ 
    // true 
} 

pero

if (4 == "4") // same value but different type 
{ 
    // true 
} 

y

if (4 === "4") // same value but different type 
{ 
    // false 
} 

Así que en los casos anteriores, lo que tiene que hacer la elección sensata si se debe usar == o ===

+0

Sí, lo sabía. Pero quiero encontrar ejemplos donde sea importante usar un operador en lugar de otro. – Bakhtiyor

+0

Mire la respuesta de Felix Kling, por ejemplo. Él entendió lo que quiero. – Bakhtiyor

+0

@Bakhtiyor: Como puede ver en mi ejemplo, esto también es útil cuando se comparan números y cadenas :) – Sarfraz

2

El operador === comprueba el tipo y la igualdad de valores.

Es por eso que 0 === false no devuelve verdadero, ya que no son del mismo tipo.

6

En strpos() tiene 0 cuando se encuentra la cadena y es falsa cuando está mal. Debe usar === para verificar la diferencia.

0

Recientemente me encontré con este problema cuando estaba escribiendo un analizador de consultas SQL rápido. Para abreviar, estaba comparando los parámetros citados con los marcadores de posición de las esquinas. Básicamente, el código siguiente me llevó a algunos momentos duros de depuración (el ejemplo se simplifica por supuesto)

$var = 0; // This is supplied dynamically 

$someCondition = $var == '?'; 

$someCondition terminó siendo cierto todo el tiempo. Shiver

Básicamente cualquier no estricto (==) <int> == <cadena> comparación hará que la cadena para ser echada a un entero. Dependiendo de la entrada, esto podría terminar en 0 o en el valor int de la cadena, si tiene alguna, incluso si toda la cadena no es completamente numérica.

1

strpos ($ needle, $ haystack) y las funciones relacionadas devolverán false si $ needle no existe en $ haystack, y 0 si $ needle es el primer caracter de $ haystack; y hay una gran cantidad de funciones similares. Usar == puede dar resultados incorrectos en este caso, por lo que siempre debe usar ===. El manual identifica claramente dónde es necesario.

6

Elija siempre === sobre == excepto que está absolutamente seguro de que necesita ==, porque == no es transitivo. Y eso a su vez es importante para su razonamiento sobre su código.

Considere el siguiente fragmento de código

if ($a == $b && $b == $c) { 
    // [1] assert: $a == $c 
} 

Alguien podría inferir a partir de la condición if que la afirmación $a == $c es cierto porque estamos tan acostumbrados a la relación de igualdad es transitiva. Pero eso no se cumple para ==, contrarrestar ejemplo:

$a = "0"; 
$b = 0; 
$c = null; 

Ahora piense en la frecuencia con la que hacemos (a veces inconscientemente) esa suposición, mientras que la escritura de código. Eso podría conducir a errores graves.

3

Un buen ejemplo donde se puede obtener en problemas está comparando 0 y una cadena, fx

if (0 == 'completed') { 
    // evaluates as TRUE 
} 

Una cadena que no empiezan con un número se convierte en 0 cuando se convierte en un int. Esto puede convertirse en un problema al comparar un estado que puede ser de 0 a una cadena.

0

Si compara dos cadenas numéricas, se comparan como números enteros.1

var_dump("15" == "0xF"); // TRUE 
var_dump("15" === "0xF"); // FALSE 

y verdadero es igual a FALSO indirectamente 2

$a = 0; 
$b = 'x'; 
var_dump(FALSE == $a); // TRUE 
var_dump($a == $b); // TRUE 
var_dump($b == TRUE); // TRUE 
var_dump(FALSE === $a); // FALSE 
var_dump($a === $b); // FALSE 
var_dump($b === TRUE); // FALSE 
Cuestiones relacionadas