spl_object_hash matches, objects not identical

2019-04-07 09:44发布

I have two object variables in PHP, let's call them $a and $b. I assume they're both the same object. And, indeed, a call to spl_object_hash() confirms this, but they each have different properties.

When I run:

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

I get:

SAME HASH
DIFFERENT PRINT_R
NOT IDENTICAL

This has got me baffled. When is the same object actually two different objects?

标签: php oop
2条回答
可以哭但决不认输i
2楼-- · 2019-04-07 10:22

There is a difference between being the same object, and having the same properties.

$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.
查看更多
趁早两清
3楼-- · 2019-04-07 10:22

Depending on the PHP version and the operating system, PHP might cast the two compared hash strings to integers before comparing them (because they look numeric). Either because the resulting numbers are very large, or contain letters, the casting could result in data loss and thus lead to the same int value for both strings. Try this:

if ('X'.spl_object_hash($a) === 'X'.spl_object_hash($b)) { ...
查看更多
登录 后发表回答