Ross McFarlane
Ross McFarlane

Reputation: 4254

spl_object_hash matches, objects not identical

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?

Upvotes: 7

Views: 2580

Answers (2)

Wolfgang Stengel
Wolfgang Stengel

Reputation: 2856

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

Upvotes: 2

Madara's Ghost
Madara's Ghost

Reputation: 174977

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.

Upvotes: 7

Related Questions