PHP上的大多數資源都不會觸及內存管理,因爲語言本身對於爲您做這件事非常好。然而,在PHP中,您通常最終會處理不是內存的外部資源 - 數據庫句柄,會話,數據庫事務等等。這些外部資源可以使用某種形式的RAII對象進行乾淨地管理。PHP支持RAII模式嗎?怎麼樣?
我最初認爲PHP使用了類似於JVM或CLR的垃圾收集方案,其中析構函數的概念不存在。 (記住:Everyone thinks about garbage collection the wrong way - 終結器不是破壞者!)有特殊的__destruct
方法,但我認爲這是一個類似於Java或C#終結器的「終結器」。由於這個原因,你不能在JVM或CLR上使用RAII(C#的using
塊可以讓你獲得大約95%的路,但這有點不同......)。
但是,Google seems to indicate that PHP supports the RAII pattern,雖然我無法在PHP文檔中找到此驗證。語言是否支持這一點,並且將清理邏輯放在__destruct
之內足以完成RAII任務?
另一個警告:當多個對象在同一時間離開的範圍,它們的析構函數被調用的順序是正式定義,通常在FIFO順序(完全與正確的RAII所需的相反)。這對我的特殊用例來說是一個破壞者。 – Brilliand 2014-01-27 20:29:34
@Brilliand你可以人爲地添加大括號來強制排序? :) – hobbs 2014-01-27 20:53:33