我正在使用SplObjectStorage来保留有关管理对象的信息。当我的对象遭到破坏时,我希望SplObjectStorage
能够自动清除没有外部引用的对象。PHP5:SplObjectStorage垃圾回收
我可以看到只有两个现在这个正确的选项:
- 具有管理对象的析构函数通知存储删除引用它;这是不可接受的,因为这些物体不应该知道经理;
- 解析debug_zval_dump()得到引用计数;恕我直言,恕我直言,太“黑客”的一个严重的应用程序。
还有其他想法吗?
我正在使用SplObjectStorage来保留有关管理对象的信息。当我的对象遭到破坏时,我希望SplObjectStorage
能够自动清除没有外部引用的对象。PHP5:SplObjectStorage垃圾回收
我可以看到只有两个现在这个正确的选项:
还有其他想法吗?
您可以尝试使用事件实现所需的功能。每个托管对象都会在销毁时生成一个事件,并且该事件上订阅了对象管理器,因此它将能够从SplObjectStorage中删除对象的引用。
这就是我想要避免的,并且是问题的先决条件:“让托管对象的析构函数通知存储删除对它的引用;这是不可接受的,因为这些对象不应该知道管理器” – Benjamin 2011-07-13 13:00:39
I然而,接受你的答案,因为我得出结论,现在在PHP中没有其他方法可以做到这一点。 – Benjamin 2011-07-21 08:54:25
在企业应用程序中使用事件是常见的做法,因此它是可扩展的解决方案。 – lisachenko 2011-07-21 12:30:43
没有不可思议的解决方案。你将不得不让你的对象知道他们的容器。你不能指望对象从他们看不到的东西中收集垃圾。 – netcoder 2011-06-13 15:46:51
@netcoder:坏消息。我希望我错过了另一种'SplObjectStorage',它会内置支持! – Benjamin 2011-06-13 15:48:08
我认为除此之外,唯一能做的就是创建自己的容器实现,为组合对象添加解析对象,将它们的'spl_object_hash'存储在映射表中,并在删除调用时清理容器发行。总之,使用默认的'SplObjectStorage'实现是不可能的。 – netcoder 2011-06-13 15:51:19