我正在研究管理唯一对象集合的代码。这段代码的第一个原型(prototype)使用了一个关联数组,基本上,这就是我一直这样做的方式。

但是,我也很想利用已添加到更现代的PHP版本中的功能(例如SplObjectStorage)来进行此操作,部分是作为一种学习体验,部分是因为它一定会提供优势(我见过的基准表明,在许多情况下,SplObjectStorage可能比阵列快)。

当前的实现具有一个关联数组,在将新对象添加到数组之前,我使用in_array检查该数组是否存在对象。

我可以用SplObjectStorage看到的最大问题是,乍看之下似乎不支持键/值关联数组的行为,而只能将其视为索引数组。但是,有关PHP的较新功能的文档不符合该语言中更多已建立部分的文档标准,因此我可能会遗漏一些东西。

我可以使用SplObjectStorage代替关联数组吗?如果是这样,如何在添加新对象时定义键?更重要的是,与关联数组相比,SplObjectStorage的相对优缺点是什么?

最佳答案

您不应该将SplObjectStorage视为键值存储,而只是一组对象。集合中是否有任何东西,但是其位置并不重要
SplObjectStorage中元素的“键”实际上是对象的哈希。它使得不可能将同一对象实例的多个副本添加到SplObjectStorage,因此您不必在添加之前检查副本是否已存在。

但是,在PHP 5.4中,有一个名为getHash()的新方法,您可以重写该方法,该方法将返回对象的“哈希”。从某种意义上讲,这将返回/设置 key ,以便您可以将其存储在不同的条件下。
SplObjectStorage的主要优点是您获得了许多用于处理不同集合(以及contains()removeAll()removeAllExcept()等)的方法。它的速度稍好一些,但的内存使用量比普通的PHP数组差的

10-05 22:28