2011-11-08 96 views
7

我有兩個對象變量在PHP中,我們姑且稱之爲$a$b。我假設他們都是同一個對象。而且,事實上,到spl_object_hash()打電話證實了這一點,但他們每個人都有不同的屬性。spl_object_hash匹配,對象不相同

當我運行:

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

我得到:

SAME HASH 
DIFFERENT PRINT_R 
NOT IDENTICAL 

這讓我百思不得其解。同一個對象何時實際上是兩個不同的對象?

+0

這裏是兩個散列的'var_dump'。 string(32)「0000000020d6b2fc000000007ad31222」 string(32)「0000000020d6b2f0000000007ad31222」 –

+0

我不知道爲什麼哈希值是相同的。有什麼能夠使這些物體變得特別嗎?你可以添加對象的定義和它們的狀態嗎? – hakre

+0

這些變量來自哪裏?我們可以重現它,還是會太複雜? – HappyDeveloper

回答

6

有是相同的對象,並且具有相同的屬性之間的差。

$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

根據不同的PHP版本和操作系統,PHP可能會投兩個比較哈希字符串整數比較之前(因爲它們看起來數字)。有的是因爲所產生的數字是非常大的,或包含字母,鑄造可能會導致數據丟失,從而導致對兩個字符串相同int值。試試這個:

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

嚴格比較你的論點是無效的。 –