2011-11-08 50 views
7

PHPで2つのオブジェクト変数がありますが、$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 

これはバッフル付き私を持っています。同じオブジェクトが実際には2つの異なるオブジェクトはいつですか?

+0

ここには、両方のハッシュの 'var_dump'があります。 文字列(32) "0000000020d6b2fc000000007ad31222" 文字列(00)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はバージョンとオペレーティングシステムによって、比較する前に2つの比較されたハッシュ文字列を比較する前に整数にすることがあります。結果の数値が非常に大きいか、文字を含むため、キャストによってデータが失われ、両方の文字列のint値が同じになる可能性があります。これを試してみてください:

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

あなたの引数は厳密な比較では無効です。 –

関連する問題