spl_object_hash matches, objects not identical

2019-04-07 09:53发布

问题:

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?

回答1:

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.


回答2:

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)) { ...


标签: php oop