2011-11-08 39 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

严格比较你的论点是无效的。 –