2012-12-10 113 views
3

PHP documentation狀態:爲什麼對象不允許作爲關聯數組中的鍵?

數組和對象不能被用作密鑰。這樣做會導致警告:非法偏移類型。

據我所知,PHP數組是有序的哈希地圖。那麼,爲什麼它本身被禁止使用對象作爲鍵,是否有這個限制的原因?爲什麼不可能在類中實現散列函數以便將其用作關鍵字?

與此相關的,是有一個哈希地圖,解決這個問題的一個PHP實現?

+1

相關:[SplObjectStorage](http://php.net/class.splobjectstorage),可在5.3 。 – Charles

+0

@Charles像一個魅力,thx! – rob

回答

3

密鑰必須是不可改變的,以便他們合作。如果你的對象是可變的,那麼它們不能是鍵。 Java和C#等

+0

問題(我不是專家,只是好奇):如果對象有一個內存地址(我猜),這個內存地址不會改變(我猜?) - 如果這樣的內存地址不改變,爲什麼這樣的地址沒有用作這個的關鍵? – Voldemort

+0

@Omega,有趣。有些語言的確可以做這樣的事情。但是,這需要* runtime *名稱和內存地址之間的中間轉換映射。此外,這對於內置內存管理的語言也會產生影響。 –

+1

@duffymo我明白鍵必須是不可變的,但它不應該是程序員的責任只使用一類的不變域生成散列? (就像在Java中一樣) – rob

2

見@duffymo的答案:在每一個實現他們的語言是真的。

請注意,有一個「變通辦法」的種類,通過使用spl_object_hash作爲您的關鍵。這將返回一個字符串,該字符串是不可變的,可以用作鍵,並且對於佔用該內存地址的任何對象都是相同的。 (閱讀:spl_object_hash將返回相同的值爲同一實例,無論它被稱爲或如果對象已更改)

+0

不幸的是,即使對象相同,「spl_object_hash」在每個腳本調用中都會返回不同的值。這會讓人感覺不方便。 – Charles

+0

那麼,根據定義,它們並不相同。他們是不同的對象。你需要實現你自己的'equals'方法,或類似的東西。更好的問題:爲什麼你需要在哈希映射中進行交叉調用比較?爲什麼不找一種方法爲這些對象創建唯一的標識符,並將它們保存在爲此而設計的系統中? –

相關問題