2011-11-08 12 views
7

Mam dwie zmienne obiektowe w PHP, nazwijmy je $a i $b. Zakładam, że oba są tym samym obiektem. I rzeczywiście, połączenie z spl_object_hash() potwierdza to, ale każdy ma inne właściwości.mecze spl_object_hash, obiekty nie identyczne

Kiedy biegnę:

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"; 
    } 

uzyskać:

SAME HASH 
DIFFERENT PRINT_R 
NOT IDENTICAL 

To ma mnie zaskoczony. Kiedy ten sam obiekt to właściwie dwa różne obiekty?

+0

Oto 'var_dump' obu skrótów. string (32) "0000000020d6b2fc000000007ad31222" string (32) "0000000020d6b2f0000000007ad31222" –

+0

Zastanawiam się również, dlaczego skróty są identyczne. Czy jest coś, co czyni te przedmioty wyjątkowymi? Czy możesz dodać definicję przedmiotowych obiektów i ich stanów? – hakre

+0

Skąd się wzięły te zmienne? Czy możemy to odtworzyć, czy byłoby to zbyt skomplikowane? – HappyDeveloper

Odpowiedz

6

Istnieje różnica między byciem tym samym obiektem i posiadaniem tych samych właściwości.

$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

zależności od wersji PHP i systemu operacyjnego, PHP może rzucić dwa ciągi hash porównaniu do liczb całkowitych przed porównując je (bo wyglądają numeryczna). Ponieważ wynikowe liczby są bardzo duże lub zawierają litery, rzutowanie może spowodować utratę danych, a tym samym doprowadzić do tej samej wartości int dla obu łańcuchów. Wypróbuj to:

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

Twój argument jest nieważny przy ścisłym porównaniu. –

Powiązane problemy