2011-06-13 109 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