
Según la documentación de PHP, el operador '==' devuelve verdadero (TRUE) sin sus operandos son iguales, mientras que '===' devuelve verdadero si los operandos son iguales y además del mismo tipo (idénticos).
Recién nos encontramos con que al hacer las comparaciones:
121574312008178411518235 == 121574312008178402299047
121574312008178411518235 === 121574312008178402299047
ambas devuelven verdadero, esto no resulta tan extraño si vemos que el valor "real" de ambos números, que es:
1.2157431200818E+23
Esto significa que estamos comparando:
1.2157431200818E+23 con: 1.2157431200818E+23
Como pueden ver, ambos son "idénticos".
Ahora bien, resulta ser que:
'121574312008178411518235' == '121574312008178402299047'
Ahora sí, esto si resulta extraño.
El problema "real" acá es que como PHP es un lenguaje no tipado (typeless), no hay una forma adecuada de decirle al lenguaje que se trata de un string. Intentamos haciendo typecasting, pero el comportamiento es el mismo.
Usando el operador '===', la siguiente comparación retorna falso:
'121574312008178411518235' === '121574312008178402299047'
Acá está el ejemplo completo:
<?php
echo "<pre>\n";
$a = 121574312008178411518235;
$b = 121574312008178402299047;
if ($a == $b){
printf("$a == $b\n");
} else {
printf("$a != $b\n");
}
if ($a === $b){
printf("$a === $b\n");
} else {
printf("$a !== $b\n");
}
$a = '121574312008178411518235';
$b = '121574312008178402299047';
echo "\n";
if ($a == $b){
printf("$a == $b\n");
} else {
printf("$a != $b\n");
}
if ($a === $b){
printf("$a === $b\n");
} else {
printf("$a !== $b\n");
}
echo "</pre>\n";
?>
Las pruebas fueron realizadas utilizando:
PHP 5.2.5, Apache 2.2.6/Mac OSX 10.5.3 (Leopard)
PHP 5.2.6 Apache 2.2.8/FreeBSD 7.0-STABLE