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?
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?
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
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
se suponía que era una actualización de su pregunta? – Gordon
-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. –
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.
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
+1 por cierto. Probablemente estabas publicando esto al mismo tiempo. – mpen
@Mark: Cool. Haber respondido +1, no hay nada de malo en hacer eso. – Cam
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 == null' evalúa como' verdadero' para mí. – mpen
Ah, mi error, probé con '===' para el último sin darme cuenta. Aquí hay una alternativa – Nacht
"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
http://se2.php.net/manual/en/language.operators.comparison.php – vichle
Las mismas muestras se pueden ejecutar en el php con los mismos resultados . – zerkms
@zerkms: ¿Todos ellos? Las cadenas y los enteros y toda esa rareza producen el mismo resultado. No solo este? – mpen