2011-11-08 2 views
7

PHP에 두 개의 개체 변수가 있습니다. $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 

은 당황 나를 가지고이. 같은 대상이 실제로 두 개의 다른 대상은 언제입니까?

+0

여기에 두 해시의 'var_dump'가 있습니다. 문자열 (32) "0000000020d6b2fc000000007ad31222" 문자열 (32) "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 버전과 운영 체제에 따라, PHP 그들을 비교하기 전에 정수로 두 개의 비교 해시 문자열을 캐스팅 수 있습니다. 결과 숫자가 매우 크거나 문자가 포함되어 있기 때문에 형 변환으로 인해 데이터가 손실 될 수 있으므로 두 문자열 모두에 동일한 int 값이 지정됩니다. 이것을 시도하십시오 :

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

엄격한 비교로 귀하의 주장은 유효하지 않습니다. –

관련 문제