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

时间:2011-10-15 05:09:53

标签: php tree

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

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

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

换句话说,如果使用

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

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

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

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

然而,我陷入两难境地:我是否

  1. 当有人设置数据时创建一个新的Tree实例?
    • 优点:代码易于编写,易于维护,易于人们接收和改进
    • 缺点:内存消耗,如果我们考虑输入的数据的一部分可能不会被使用。由于必须为特殊情况编写特殊方法(而不是处理本机数组),因此操作变得更加混乱。
  2. 保持原样,但有人做$ class [$ index] = array($ index2 => $ array)?
    • 优点:一切都保存为数组,因此正常的数组函数可以工作,内存消耗也是如此 最小的。
    • 缺点:用法不那么“优雅”,可能更复杂。
  3. 我知道这不是一个论坛,所以我不是在征求意见,而是征求已经在PHP中开发(可能很重)树结构的人的建议,以及最好的方法(或“接受方式”)去做吧。

1 个答案:

答案 0 :(得分:1)

演示creating the Tree on construct和演示creating Tree on demand是您可以自行运行的简单测试。

后者只有在访问它们时才会创建新的节点对象,因此内存消耗不会很高。

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