Gor*_*onM 29 php oop spl associative-array
我正在研究代码来管理一系列独特的对象.这段代码的第一个原型使用了一个关联数组,基本上就像我一直这样做的那样.
但是,我也热衷于利用已经添加到更现代版本的PHP中的功能,例如SplObjectStorage来实现这一目的,部分原因在于学习体验,部分原因在于它必然会提供优势(我已经看到基准测试表明在很多情况下,SplObjectStorage可以比数组更快.
当前实现有一个关联数组,我在in_array中检查它是否在向对象添加新对象之前是否已经在数组中.
最大的问题,我可以SplObjectStorage看到的是,它似乎并没有(乍)支持键/值关联数组的行为,只能被视为一个索引数组.但是,PHP较新功能的文档不符合语言中较为成熟的部分的文档标准,我可能只是遗漏了一些东西.
我可以使用SplObjectStorage代替关联数组吗?如果是这样,我如何在添加新对象时定义键?更重要的是,与关联数组相比,SplObjectStorage的相对优势和劣势是什么?
Jay*_*aph 26
您不应该将其SplObjectStorage视为键值存储,而应仅仅是一组对象.有什么东西在集合中,但它的位置并不重要.
SplObjectStorage事实上,元素的"关键" 是对象的散列.它使得无法将相同对象实例的多个副本添加到a SplObjectStorage,因此您无需在添加之前检查副本是否已存在.
但是,PHP 5.4有一个新的方法getHash(),你可以覆盖它将返回对象的"哈希".这在某种意义上 - 返回/设置密钥,以便您可以在不同条件下存储它.
的主要优点SplObjectStorage是,你获得大量的方法来处理,并用不同的集(交互的事实contains(),removeAll(),removeAllExcept()等).它的速度稍微好一些,但内存使用情况比普通PHP数组差.
小智 5
在10000次迭代中运行基准测试后的结果PHP 5.6.13:
+------------------+----------------+----------------+---------+
| Type | Time to fill | Time to check | Memory |
+------------------+----------------+----------------+---------+
| SplObjectStorage | 0.021285057068 | 0.019490000000 | 2131984 |
| Array | 0.021125078201 | 0.020912000000 | 1411440 |
+------------------+----------------+----------------+---------+
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,Array是不是明显快比SplObjectStorage,但使用34%的内存更少。