1 回答

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