1 回答
TA贡献1828条经验 获得超3个赞
据我所知,不会为同一个对象调用两次析构函数。重用析构函数中的对象通常是一种不好的做法。调用析构函数的对象应该被销毁,而不是重用。在您的测试脚本中它不会导致任何严重的问题,但在现实生活中,如果开发人员不小心,这种用法可能会导致意外行为。
起初,当我阅读您的问题时,我担心您造成了内存泄漏,但事实并非如此。Bar()
仅当尚未在此对象上调用析构函数时,才在离开范围时调用析构函数。但是,由于您保存了引用并在垃圾收集器ref_count
内部增加了此对象的引用,__destruct()
因此尚无法收集该对象。它必须等到下一次你减少ref_count
这个对象的时候。
该过程可以解释如下(简化):
您调用
Bar()
创建一个实例的函数FOO
。一个对象被创建并分配给$foo
。(ref_count = 1
)在结束时
Bar()
对该对象的唯一引用丢失(ref_count = 0
),这意味着 PHP 开始销毁该对象的过程。
2.1。析构函数被调用。在析构函数内部,您将ref_count
增加到 1。
2.2。下一步将是 GC 收集对象,但ref_count
不是零。在您的示例中,这可能意味着循环或类似,在析构函数中创建了一个新引用。GC 必须等到没有非循环引用才能收集对象。你
Bar()
再打电话。您将同一个对象从静态数组中移出,这意味着其中的引用FOO::$pool
已经消失,但您立即将其分配给$foo
. (ref_count = 1
)在结束时
Bar()
对该对象的唯一引用丢失(ref_count = 0
),这意味着 GC 最终可以收集该对象。析构函数已经被调用了,所以这里不需要采取其他行动。
你没有回收对象,你只是延长了它在内存中的存在。您可以访问它一段时间,但对于 PHP,该对象已经处于被销毁的过程中。
- 1 回答
- 0 关注
- 72 浏览
添加回答
举报