2011-11-08 35 views
7

Tôi có hai biến đối tượng trong PHP, hãy gọi cho chúng $a$b. Tôi cho rằng chúng đều là cùng một đối tượng. Và, thực sự, một cuộc gọi đến số spl_object_hash() xác nhận điều này, nhưng mỗi người có các đặc tính khác nhau.đối sánh spl_object_hash, đối tượng không giống nhau

Khi tôi chạy:

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

tôi nhận được:

SAME HASH 
DIFFERENT PRINT_R 
NOT IDENTICAL 

này đã khiến tôi bối rối. Khi nào thì cùng một đối tượng thực sự là hai đối tượng khác nhau?

+0

Đây là 'var_dump' của cả hai băm. chuỗi (32) "0000000020d6b2fc000000007ad31222" chuỗi (32) "0000000020d6b2f0000000007ad31222" –

+0

Tôi tự hỏi tại sao các băm giống hệt nhau. Có điều gì khiến những vật thể này trở nên đặc biệt không? Bạn có thể thêm định nghĩa của các đối tượng được đề cập và trạng thái của chúng không? – hakre

+0

Và các biến đó đến từ đâu? Chúng ta có thể tái tạo nó, hoặc nó sẽ quá phức tạp? – HappyDeveloper

Trả lời

6

Có sự khác biệt giữa việc là cùng một đối tượng và có cùng thuộc tính.

$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

Tùy thuộc vào phiên bản PHP và hệ điều hành, PHP có thể truyền hai chuỗi băm đã so sánh thành số nguyên trước khi so sánh chúng (vì chúng trông dạng số). Hoặc vì các số kết quả là rất lớn hoặc chứa các chữ cái, quá trình truyền có thể dẫn đến mất dữ liệu và do đó dẫn đến cùng một giá trị int cho cả hai chuỗi. Hãy thử điều này:

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

Đối số của bạn không hợp lệ với so sánh nghiêm ngặt. –

Các vấn đề liên quan