在PHP中实现一个内存高效的arrayAccess类


Implementing a memory-efficient arrayAccess class in PHP

我正在创建一个实现复合模式的类;这个类应该能够表示一个树(所以我们叫它tree)。

为了尽可能少地使用内存,当一个Tree类实例被传递给一个数组时,它将被保存为一个数组,直到需要索引;此时创建并返回一个新的子Tree实例

这样做的原因是:My Tree实例通过许多过滤器,它们的内容可能被许多观察者遍历和修改,但它们的内容只会被请求一次(在最终呈现时)。此外,某些块可能根本不被呈现,因此创建甚至不打算使用的Tree实例会浪费内存。

换句话说,如果使用

$class->set($array,$index); //(or $class[$index] = $array)

,数组按正常方式存储。但是当有人使用

$class->get($index) //(or $class[$index])

,将返回一个新的Tree实例(并为后续调用缓存)。

然而,我陷入了一个两难的境地:我应该

  1. 创建一个新的实例树当有人设置数据?
    • 优点:代码易于编写,易于维护,易于接受和改进
    • 缺点:内存消耗,甚至更多,如果我们考虑的一部分数据输入可能不会被使用。操作变得更加混乱,因为必须为特殊情况编写特殊方法(与处理本机数组相反)。
  2. 让它保持原样,但人们做$class[$index] = array($index2=>$array)?
      优点:所有东西都存储为数组,所以正常的数组函数工作,内存消耗是最小。
  3. 缺点:使用不那么"优雅",可能更复杂。

我知道这不是一个论坛,所以我不是在征求意见,而是向那些已经在PHP中开发了(可能很重的)树结构的人的建议,以及什么是最好的方法(或"可接受的方法")去做。

根据构造创建树的演示和按需创建树的演示是您可以自己运行的简单测试。

后者仅在访问节点对象时创建新的节点对象,因此内存消耗并不高。

面向对象编程、封装和外观的美妙之处在于,没有人关心你在内部做什么,只要API做它应该做的。无论谁使用你的TreeNode都不需要知道它是如何在内部工作的。只要感觉正确就行。正确设计你的api,你可以随时更改内部。