关联数组与 SplObjectStorage

2022-08-30 13:41:54

我正在编写代码来管理唯一对象的集合。此代码的第一个原型使用关联数组,基本上是因为这是我一直以来的做法。

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

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

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

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


答案 1

您不应将 视为键值存储,而只是一组对象。有些东西是否在集合中,但它的位置并不重要SplObjectStorage

中元素的“键”实际上是对象的哈希。这使得无法将同一对象实例的多个副本添加到 中,因此您不必在添加之前检查副本是否已存在。SplObjectStorageSplObjectStorage

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

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


答案 2

在 上运行 10000 次迭代的基准测试后的结果:PHP 5.6.13

类型 填充时间 检查时间 记忆
SplObjectStorage 0.021285057068 0.019490000000 2131984
数组 0.021125078201 0.020912000000 1411440

如您所见,并不明显快于 ,但使用的内存减少了 34%ArraySplObjectStorage


推荐