我正在研究管理唯一对象集合的代码。这段代码的第一个原型(prototype)使用了一个关联数组,基本上,这就是我一直这样做的方式。
但是,我也很想利用已添加到更现代的PHP版本中的功能(例如SplObjectStorage)来进行此操作,部分是作为一种学习体验,部分是因为它一定会提供优势(我见过的基准表明,在许多情况下,SplObjectStorage可能比阵列快)。
当前的实现具有一个关联数组,在将新对象添加到数组之前,我使用in_array检查该数组是否存在对象。
我可以用SplObjectStorage看到的最大问题是,乍看之下似乎不支持键/值关联数组的行为,而只能将其视为索引数组。但是,有关PHP的较新功能的文档不符合该语言中更多已建立部分的文档标准,因此我可能会遗漏一些东西。
我可以使用SplObjectStorage代替关联数组吗?如果是这样,如何在添加新对象时定义键?更重要的是,与关联数组相比,SplObjectStorage的相对优缺点是什么?
最佳答案
您不应该将SplObjectStorage
视为键值存储,而只是一组对象。集合中是否有任何东西,但是其位置并不重要。SplObjectStorage
中元素的“键”实际上是对象的哈希。它使得不可能将同一对象实例的多个副本添加到SplObjectStorage
,因此您不必在添加之前检查副本是否已存在。
但是,在PHP 5.4
中,有一个名为getHash()
的新方法,您可以重写该方法,该方法将返回对象的“哈希”。从某种意义上讲,这将返回/设置 key ,以便您可以将其存储在不同的条件下。SplObjectStorage
的主要优点是您获得了许多用于处理不同集合(以及contains()
,removeAll()
,removeAllExcept()
等)的方法。它的速度稍好一些,但的内存使用量比普通的PHP数组差的。