34

我正在编写代码来管理一组独特的对象。这段代码的第一个原型使用了一个关联数组,基本上我一直都是这样做的。

但是,我也热衷于利用添加到更现代 PHP 版本中的功能,例如[SplObjectStorage][1]这样做,部分是作为一种学习经验,部分是因为它一定会提供优势(我见过的基准表明SplObjectStorage可以在很多情况下比数组快)。

当前的实现有一个关联数组,我in_array()在向它添加新对象之前检查对象是否已经在数组中。

我可以看到的一个大问题SplObjectStorage是它似乎(乍一看)不支持键/值关联数组行为,并且只能被视为索引数组。但是,PHP 新功能的文档不符合该语言更成熟部分的文档标准,我可能只是遗漏了一些东西。

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

4

3 回答 3

29

您不应将SplObjectStorage视为键值存储,而应仅将其视为一组对象。某物是否在集合中,但它的位置并不重要

中元素的“键”SplObjectStorage实际上是对象的散列。这使得不可能将同一对象实例的多个副本添加到 中SplObjectStorage,因此您不必在添加之前检查副本是否已经存在。

但是,PHP 5.4有一个新方法称为getHash(),您可以覆盖该方法将返回对象的“散列”。这 - 在某种意义上 - 返回/设置密钥,以便您可以允许它在不同的条件下存储。

的主要优点SplObjectStorage是您获得了许多方法来处理和交互不同的集合(,contains()removeAll()removeAllExcept()。它的速度略好,但内存使用比普通的 PHP 数组差。

于 2012-01-30T19:32:24.243 回答
8

在 上运行 10000 次迭代后结果PHP 5.6.13

类型 填写时间 检查时间 记忆
SplObjectStorage 0.021285057068 0.019490000000 2131984
大批 0.021125078201 0.020912000000 1411440

正如你所看到的,Array没有明显比快SplObjectStorage,但使用的内存减少了 34%

于 2015-10-08T18:39:13.320 回答
1

当分配给数组的所有内存都用完时,分配给它的内存将翻倍。在这种情况下,对象的集合可能是更有效的结构。

于 2015-04-21T17:28:39.177 回答