2011-06-13 85 views
4

我正在使用SplObjectStorage来保留有关管理对象的信息。当我的对象遭到破坏时,我希望SplObjectStorage能够自动清除没有外部引用的对象。PHP5:SplObjectStorage垃圾回收

我可以看到只有两个现在这个正确的选项:

  • 具有管理对象的析构函数通知存储删除引用它;这是不可接受的,因为这些物体不应该知道经理;
  • 解析debug_zval_dump()得到引用计数;恕我直言,恕我直言,太“黑客”的一个严重的应用程序。

还有其他想法吗?

+1

没有不可思议的解决方案。你将不得不让你的对象知道他们的容器。你不能指望对象从他们看不到的东西中收集垃圾。 – netcoder 2011-06-13 15:46:51

+0

@netcoder:坏消息。我希望我错过了另一种'SplObjectStorage',它会内置支持! – Benjamin 2011-06-13 15:48:08

+0

我认为除此之外,唯一能做的就是创建自己的容器实现,为组合对象添加解析对象,将它们的'spl_object_hash'存储在映射表中,并在删除调用时清理容器发行。总之,使用默认的'SplObjectStorage'实现是不可能的。 – netcoder 2011-06-13 15:51:19

回答

0

您可以尝试使用事件实现所需的功能。每个托管对象都会在销毁时生成一个事件,并且该事件上订阅了对象管理器,因此它将能够从SplObjectStorage中删除对象的引用。

+0

这就是我想要避免的,并且是问题的先决条件:“让托管对象的析构函数通知存储删除对它的引用;这是不可接受的,因为这些对象不应该知道管理器” – Benjamin 2011-07-13 13:00:39

+0

I然而,接受你的答案,因为我得出结论,现在在PHP中没有其他方法可以做到这一点。 – Benjamin 2011-07-21 08:54:25

+0

在企业应用程序中使用事件是常见的做法,因此它是可扩展的解决方案。 – lisachenko 2011-07-21 12:30:43