簡體   English   中英

關聯數組與 SplObjectStorage

[英]Associative Array versus SplObjectStorage

我正在編寫代碼來管理一組獨特的對象。 這段代碼的第一個原型使用了一個關聯數組,基本上我一直都是這樣做的。

但是,我也熱衷於利用已添加到更現代版本的 PHP(例如[SplObjectStorage][1]功能來代替這樣做,部分是作為學習經驗,部分是因為它一定會提供優勢(基准我已經看到表明SplObjectStorage在很多情況下可以比數組更快)。

當前實現有一個關聯數組,我使用in_array()檢查該數組,以在向數組中添加新對象之前查看對象是否已經在數組中。

我可以看到SplObjectStorage的一個大問題是它似乎(乍一看)不支持鍵/值關聯數組行為,並且只能被視為索引數組。 然而,PHP 新特性的文檔不符合該語言更成熟部分的文檔標准,我可能只是遺漏了一些東西。

我可以使用SplObjectStorage代替關聯數組嗎? 如果是這樣,在添加新對象時如何定義鍵? 更重要的是,與關聯數組相比, SplObjectStorage的相對優勢和劣勢是什么?

您不應該將SplObjectStorage視為鍵值存儲,而只是一組對象 某些東西是否在集合中,但它的位置並不重要

SplObjectStorage元素的“鍵”實際上是對象的哈希值。 這使得無法將同一對象實例的多個副本添加到SplObjectStorage ,因此您不必在添加之前檢查副本是否已存在。

但是,在PHP 5.4有一個名為getHash()的新方法,您可以覆蓋它,該方法將返回對象的“哈希”。 這 - 從某種意義上說 - 返回/設置密鑰,以便您可以允許它在不同條件下存儲。

SplObjectStorage的主要優點是您可以獲得許多用於處理和交互不同集合的方法( contains()removeAll()removeAllExcept())。 它的速度稍好一些,但內存使用比普通的 PHP 數組

PHP 5.6.13上運行 10000 次迭代的基准測試后的結果:

類型 填寫時間 檢查時間 記憶
對象存儲 0.021285057068 0.019490000000 2131984
大批 0.021125078201 0.020912000000 1411440

如您所見, Array沒有明顯快SplObjectStorage ,但使用的內存減少了 34%

當分配給數組的內存全部用完時,分配給它的內存會翻倍。 在這種情況下,對象集合可能是更有效的結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM