2011-01-20 12 views
7

En JavaScript, el operador == no es necesariamente transitiva:¿Es el operador == transitivo en PHP?

js> '0' == 0 
true 
js> 0 == '' 
true 
js> '0' == '' 
false 

¿Ocurre lo mismo en PHP? ¿Puede dar un ejemplo?

+0

http://se2.php.net/manual/en/language.operators.comparison.php – vichle

+0

Las mismas muestras se pueden ejecutar en el php con los mismos resultados . – zerkms

+0

@zerkms: ¿Todos ellos? Las cadenas y los enteros y toda esa rareza producen el mismo resultado. No solo este? – mpen

Respuesta

14

No, el operador == no es transitivo.

El mismo escenario da el mismo resultado en PHP.

echo var_dump('0'==0); 
echo var_dump(0==''); 
echo var_dump('0'==''); 

rendimientos:

boolean true 
boolean true 
boolean false 
+1

Sí. La razón de esto es porque el operando derecho está encasillado en el tipo de datos del operando izquierdo. '0' typecast a una cadena se convierte en' '0'', '' '' typecast a un int se convierte en '0', pero'' ''ya es una cadena, por lo que se compara directamente con'' 0'' y se encuentra no es igual. Aunque las razones exactas en javascript son un poco diferentes. – keithjgrant

+2

se suponía que era una actualización de su pregunta? – Gordon

+3

-1 ¿Por qué respondes tu propia pregunta? (Si conocía la respuesta, ¿por qué preguntarla?) Sin ofender, pero con un representante de> 10K debería saber mejor y las preguntas de "mostrar y contar" no son realmente aceptables. –

2

Lo mismo es cierto en PHP:

//php 

'0'==0 //true 
0=='' //true 
''=='0' //false 

¿No ha probarlo tú mismo? Estas son las mismas declaraciones que proporcionó para javascript.

+1

Sí, lo hice. Un segundo después de publicarlo. Ver mi respuesta Fue una derivación de esta pregunta: http://stackoverflow.com/questions/4752579/are-all-php-equality-comparisons-reflexive Pidió que esté completo y que otros SO-ers estén al tanto ... no es realmente intuitivo. – mpen

+0

+1 por cierto. Probablemente estabas publicando esto al mismo tiempo. – mpen

+0

@Mark: Cool. Haber respondido +1, no hay nada de malo en hacer eso. – Cam

1
array() == NULL // true 
0 == NULL  // true 
array() == 0 // false 

El problema con los lenguajes de scripting es que comenzamos a comparar cosas de una manera no estricta, lo que lleva a diferentes sentidos de "igualdad". cuando comparas "0" y 0, te refieres a algo diferente, entonces cuando comparas "0" y NULL. Por lo tanto, tiene sentido que estos operadores no sean transitivos. La reflexividad sin embargo, debe ser un invariante. La igualdad es por definición reflexiva. No importa qué sentido entiendas por igualdad, siempre debería ser cierto que A se iguala a sí mismo.

otro más obvia:

true == 1 // true 
true == 2 // true 
1 == 2 // false 
+0

'0 == null' evalúa como' verdadero' para mí. – mpen

+0

Ah, mi error, probé con '===' para el último sin darme cuenta. Aquí hay una alternativa – Nacht

+0

"tiene sentido que estos operadores no sean transitivos", solo si inclina su cabeza y la mira de una manera extraña. Ninguno de tus ejemplos tiene sentido para mí; Creo que deberían devolver 'null' en su lugar o error de salida. En tu última oración, ¿quieres decir si 'A == B' implica' B == A'? Pero si PHP puede violar otras leyes de la lógica, realmente no me sorprendería que eso tampoco siempre fuera verdad. – mpen