2014-01-30 37 views
14

我的一些類將其構造函數聲明爲private,因爲此類的對象只允許由該類的靜態方法創建。我是否也可以將這些類的析構函數聲明爲private以保持對稱性,是否安全?可以將析構函數聲明爲private嗎?

編輯:好吧,看起來這簡直是不可能的:

Fatal error: Call to private AClass::__destruct() from context '' in /script on line 0 

(背景下是空的,有作爲線0沒有這樣的事)。出於某種原因,我曾經認爲PHP運行時是全能的,可以破壞任何想要的東西。

回答

15

在php的__destruct神奇的方法必須public。該方法將自動從實例外部調用。聲明__destructprotectedprivate將導致警告並且不會調用魔術方法。

沒有必要對稱,因爲您永遠不應該明確地調用__destruct

+0

致命錯誤:聲明爲私有時從上下文調用私有Foo :: __ destruct() – zloctb

2

似乎你正在實現單例模式。在這個模式中,構造函數必須是私有的,並且你有一個返回類實例的靜態方法。如果沒有實例,則此靜態方法將創建並返回它。

如果將析構函數設置爲private,則不允許其他類或函數破壞該實例,如果在應用程序的執行點中不再使用該實例,則這可能不一致。沒有必要將析構函數設置爲private,因爲即使它是公共的,靜態方法也可以在沒有人的情況下返回新實例。

+0

他們仍然要小心靜態getter和析構函數在類定義中的單例的指針/槽的同步。不希望靜態getter在它被銷燬之前返回單身人士。 – atk

+0

另外請記住,單身模式在大多數(並非全部)情況下是非常糟糕的模式,並引入了許多設計問題。也不可能對它們進行適當的單元測試。 – ToBe

+0

它是在構建類的對象時使用多種靜態方法模擬函數重載的方式(PHP中不支持重載) –

相關問題