spl_object_hash匹配,对象不相同

时间:2011-11-08 16:09:41

标签: php oop

我在PHP中有两个对象变量,我们称之为$a$b。我认为它们都是同一个对象。实际上,对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

这令我感到困惑。什么时候同一个对象实际上是两个不同的对象?

2 个答案:

答案 0 :(得分:7)

同一个对象和具有相同属性之间存在差异。

$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.

答案 1 :(得分:2)

根据PHP版本和操作系统的不同,PHP可能会在比较它们之前将两个比较的哈希字符串转换为整数(因为它们看起来是数字)。由于结果数字非常大或包含字母,因此转换可能导致数据丢失,从而导致两个字符串的int值相同。试试这个:

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