2016-05-12 87 views
0

我瞭解spl_object_hash()並不太瞭解什麼是幕後在這種情況下:spl_object_hash()返回不同的ID

$obj = new stdClass; 
$id1 = spl_object_hash($obj); 
$id2 = spl_object_hash(new stdClass); 
echo $id1.'<br>'.$id2; 

Q1。爲什麼$id1 !== $id2

在參考:

當對象被銷燬,其散列可以重新用於其它目的。

問題2是否有與該陳述有關的內容?或者我錯過了其他的東西?

回答

3

spl_object_hash是做什麼用的?

[Returns a]字符串,對於每個當前存在的對象都是唯一的,並且對於每個對象始終相同。

爲了闡明該陳述:如果你有對象A,每次你散列對象A,它將返回相同的散列值。如果你有對象A和對象B,即使它們是相同的類型並且包含相同的值,它們的哈希將會不同,因爲它們不是同一個對象(實例)。

由於您有兩個不同的對象,因此預計它們各自的ID不同。

+2

要添加re:Q1中的引用 - 如果在實例化stdClass的第二個實例之前銷燬了$ id1,那麼再次使用相同散列的可能性很小。 –

2

讓我們逐步檢查您的代碼。

(1) $obj = new stdClass; 
(2) $id1 = spl_object_hash($obj); 
(3) $id2 = spl_object_hash(new stdClass); 
(4) echo $id1.'<br>'.$id2; 

1:創建一個新的對象stdClass已經

2:獲取此對象的散列。

3:獲取另一個(完全不同)stdClass對象的散列。

4:回聲ids。

我相信混淆來自第三步。你創建一個新對象,與第一個對象完全不同,儘管它是相同的類型(類)。 spl_object_hash在「對象級別」上運行,這意味着它將爲不同的對象返回不同的散列值。