2011-01-20 11 views

Respuesta

3

Depende de lo que ocurra entre esas dos llamadas. De lo contrario, sí, esos son lo mismo. La orden no hace diferencia. El uso de 2 es igual a == Una cadena de 1 y un entero de 1, devolverá verdadero en comparación. El tipo se ignora, solo se compara el valor. Entonces no hay maldad.

http://php.net/manual/en/language.operators.comparison.php

<? 

$a=(string) 1; 
$b=(int) 1; 

var_dump($a); 
var_dump($b); 


echo $a==$b; 

Salidas: 1

http://www.ideone.com/JLJWQ

EDIT

Para aclarar, no hay absolutamente nada que nunca se puede poner en $ ao $ b para obtener una salida diferente en la comparación, simplemente poniéndolo del otro lado del operador.

$a="1234"; 
$b="1234"; 

echo $a==$b; 
echo $b==$a; 

La salida del que, para cualquier $ ao $ b valores, siempre y sin lugar a dudas ser verdad verdadera, falsa o falsa.

+1

Sí, pero ese es un ejemplo simple. Pensé que tal vez había algunos casos extraños como '" 01 "== 1' el 1 podría convertirse en una cadena y luego no serían iguales, pero en' 1 == "01" 'la cadena se convertiría a un int, y luego serían iguales. Sin embargo, sé que este no es el caso. http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion Pero tal vez haya algunos extraños que no conozco. – mpen

+0

bueno ... hay uno un poco raro que se menciona en los comentarios. Es con cadenas numéricas. Pero es como se esperaba. Sin embargo, incluso en esto, el lado del operador está encendido, no importará. http://www.ideone.com/UHD43 – profitphp

+0

Sí ... es extraño, pero al menos está documentado. Aceptando esta respuesta por ser definitiva. – mpen

3

En resumen, sí. $a == $b siempre será el equivalente a $b == $a. Hay algunas deficiencias, como flotadores. Por supuesto, no deberías anidar dos flotadores para la igualdad de todos modos.

EDITAR
flotadores que afectan a: Si tuviera dos flotador y los compararon, que técnicamente deben ser los mismos. Sin embargo, los valores de punto flotante que parecen tener el mismo valor no necesitan ser realmente idénticos. Entonces, si $a es un literal .69 y $b es el resultado de un cálculo, pueden ser muy diferentes, pero ambos muestran el mismo valor. Esta es la razón por la que nunca debe comparar los valores de punto flotante usando ==.

Si necesita comparar valores de coma flotante, realmente necesita usar la diferencia aceptable más pequeña en su caso específico. Algo como esto funcionaría para la comparación de los flotadores (ajuste de nuestra diferencia aceptable más pequeño en 0.000001):

if(abs($a-$b) < 0.000001) { 
    //Same 
} 

PHP: abs - Absolute Value

+2

¿Puedes dar un ejemplo de dónde compararían los flotadores de una manera, pero no de la otra? Entiendo los errores de redondeo debidos a los flotadores, pero ¿no deberían compararse sistemáticamente en cualquier dirección? – mpen

+0

He actualizado mi respuesta para incluir más información sobre comparaciones de flotantes. Espero que ayude. –

+0

No, no :) Eso no está relacionado. Gracias sin embargo. – mpen

2

http://php.net/manual/en/language.operators.comparison.php

Hay operadores diffrent puede utilizar si usted desea considerar la conversión de tipos de la comparación. == se evalúa como verdadero en un valor igual, pero no compara el tipo de datos. === se evalúa como verdadero cuando los valores son iguales al igual que los tipos de datos. El uso de este último considera la conversión de tipo donde normalmente se ignoraría (por ejemplo: cadena que representa un entero y un entero que se está comparando).

El orden de la lógica en el condicional no debe marcar la diferencia.

+2

No me gusta su uso de la palabra "debería". Estaba esperando una respuesta definitiva :) – mpen

1

me han tratado una serie de variaciones y no se puede encontrar un caso en el que ($a == $b) !== ($b == $a) pero ninguno hasta ahora han trabajado:

<?php 

$a = 0; 
$b = "0"; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = 0; 
$b = NULL; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = 0; 
$b = false; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = false; 
$b = NULL; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = ""; 
$b = NULL; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = "NULL"; 
$b = NULL; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = 0.000000000000000000000000001; 
$b = 0; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = array(); 
$b = array(); 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

Por lo tanto, renunciar a este punto. Ideas bienvenidas!

3

El único tipo que podía ver ser diferente es algo así como:

$foo = 1; 
$bar = 1; 

($foo = $foo + $bar) == ($bar = $foo); 

Para ver por qué, mirarlo

A -> ($foo = $foo + $bar) 
B -> ($bar = $foo); 

Si A se ejecuta en primer lugar, el resultado será 2 y el resultado de B será 2, por lo que son iguales y la prueba será true.

Si B se ejecuta en primer lugar, el resultado será 1, y el resultado de B habrá 2, por lo que no son iguales y la prueba habrá false.

Pero para cualquier comparación de un solo tipo (Donde A es una variable y no una expresión) siempre será reflexivo.

Por lo tanto, en el sentido general, A == B no siempre es 100% garantizado que es equivalente a B == A. Para las variables, siempre será equivalente. Pero para expresiones complejas que implican asignación o modificación de variables, puede no serlo.

Cuestiones relacionadas