1 回答

TA貢獻1828條經(jīng)驗 獲得超3個贊
據(jù)我所知,不會為同一個對象調(diào)用兩次析構(gòu)函數(shù)。重用析構(gòu)函數(shù)中的對象通常是一種不好的做法。調(diào)用析構(gòu)函數(shù)的對象應(yīng)該被銷毀,而不是重用。在您的測試腳本中它不會導(dǎo)致任何嚴重的問題,但在現(xiàn)實生活中,如果開發(fā)人員不小心,這種用法可能會導(dǎo)致意外行為。
起初,當(dāng)我閱讀您的問題時,我擔(dān)心您造成了內(nèi)存泄漏,但事實并非如此。Bar()
僅當(dāng)尚未在此對象上調(diào)用析構(gòu)函數(shù)時,才在離開范圍時調(diào)用析構(gòu)函數(shù)。但是,由于您保存了引用并在垃圾收集器ref_count
內(nèi)部增加了此對象的引用,__destruct()
因此尚無法收集該對象。它必須等到下一次你減少ref_count
這個對象的時候。
該過程可以解釋如下(簡化):
您調(diào)用
Bar()
創(chuàng)建一個實例的函數(shù)FOO
。一個對象被創(chuàng)建并分配給$foo
。(ref_count = 1
)在結(jié)束時
Bar()
對該對象的唯一引用丟失(ref_count = 0
),這意味著 PHP 開始銷毀該對象的過程。
2.1。析構(gòu)函數(shù)被調(diào)用。在析構(gòu)函數(shù)內(nèi)部,您將ref_count
增加到 1。
2.2。下一步將是 GC 收集對象,但ref_count
不是零。在您的示例中,這可能意味著循環(huán)或類似,在析構(gòu)函數(shù)中創(chuàng)建了一個新引用。GC 必須等到?jīng)]有非循環(huán)引用才能收集對象。你
Bar()
再打電話。您將同一個對象從靜態(tài)數(shù)組中移出,這意味著其中的引用FOO::$pool
已經(jīng)消失,但您立即將其分配給$foo
. (ref_count = 1
)在結(jié)束時
Bar()
對該對象的唯一引用丟失(ref_count = 0
),這意味著 GC 最終可以收集該對象。析構(gòu)函數(shù)已經(jīng)被調(diào)用了,所以這里不需要采取其他行動。
你沒有回收對象,你只是延長了它在內(nèi)存中的存在。您可以訪問它一段時間,但對于 PHP,該對象已經(jīng)處于被銷毀的過程中。
- 1 回答
- 0 關(guān)注
- 93 瀏覽
添加回答
舉報