2011-11-08 6 views
7

Tengo dos variables de objeto en PHP, llamémosles $a y $b. Supongo que ambos son el mismo objeto. Y, de hecho, una llamada al spl_object_hash() confirma esto, pero cada uno tiene diferentes propiedades.spl_object_hash partidos, los objetos no idéntico

cuando corro:

if(spl_object_hash($a) === spl_object_hash($b)){ 
    echo "SAME HASH\n"; 
}else{ 
    echo "DIFFERENT HASH\n"; 
} 

if(print_r($a,TRUE) === print_r($b,TRUE)){ 
    echo "SAME PRINT_R\n"; 
}else{ 
    echo "DIFFERENT PRINT_R\n"; 
} 

if($a === $b){ 
     echo "IDENTICAL"; 
    }else{ 
     echo "NOT IDENTICAL"; 
    } 

me sale:

SAME HASH 
DIFFERENT PRINT_R 
NOT IDENTICAL 

Esto me tiene desconcertado. ¿Cuándo es el mismo objeto en realidad dos objetos diferentes?

+0

Aquí está el 'var_dump' de ambos hashes. cadena (32) "0000000020d6b2fc000000007ad31222" cadena (32) "0000000020d6b2f0000000007ad31222" –

+0

Me pregunto por qué los hash son idénticos. ¿Hay algo que haga que estos objetos sean especiales? ¿Puedes agregar la definición de los objetos en cuestión y sus estados? – hakre

+0

¿Y de dónde provienen esas variables? ¿Podemos reproducirlo, o sería demasiado complicado? – HappyDeveloper

Respuesta

6

hay una diferencia entre ser el mismo objeto, y que tiene las mismas propiedades.

$a = new stdClass("same", "parameters", 1337); 
$b = new stdClass("same", "parameters", 1337); 

var_dump($a == $b); //True 
var_dump($a === $b); //False! 

$b = $a; 

var_dump($a === $b); //Now true. 
2

Dependiendo de la versión de PHP y el sistema operativo, PHP pueda poner las dos cadenas de hash en comparación con los números enteros antes de compararlos (porque se ven numérico). Ya sea porque los números resultantes son muy grandes o contienen letras, la conversión podría provocar la pérdida de datos y, por lo tanto, generar el mismo valor int para ambas cadenas. Pruebe esto:

if ('X'.spl_object_hash($a) === 'X'.spl_object_hash($b)) { ... 
+0

Su argumento no es válido con una comparación estricta. –

Cuestiones relacionadas