2010-10-29 41 views
1

考慮看看一些舊代碼後:由拆解在PHP

$Cache->destroy(); 

但是在PHP 5.3

//Nothing like a destructor!! 
function destroy() { 
    settype(&$this, 'null'); 
} 

而且叫我得到 推薦使用:在調用的時候傳遞通過引用具有已在/blah/-cache-.php上在線154中棄用

我應該怎麼做?

回答

8

您可以通過刪除$this中的&來滿足您的直接問題,但是整個構造對我來說沒有意義。如果從對象的上下文中銷燬$this並非明顯無效,那絕對不是好習慣。

要消滅的對象,一個簡單的

unset($Cache); 

會做。

如果想要在對象被銷燬時執行某些東西,應該在類中定義一個destructor。 (在你的destroy()代碼中的評論說,這不是這裏的重點:) :)

2

只要摧毀像正常的對象。

unset($Cache); 

我不知道他們爲什麼會在上面看起來很骯髒。請記住,如果對象的指針位於不同的地方,您將需要取消所有這些指針 - 而不僅僅是這一行。 (單身人士是一個例子)

1

你得到的錯誤與析構函數無關。這個錯誤僅僅是因爲你試圖在函數調用中通過引用傳遞$ this。

PHP用於允許這樣做,但在當前版本的PHP中,如果您想通過引用傳遞某些內容,則應在函數聲明中指定它。

因此,你的函數調用應該是這樣的:

settype($this, 'null'); 

(即不帶&)。 (順便說一句 - 「空」在一個字符串???的話,就是你的意思?)

如果你想通過裁判通過,你的函數應該是這樣的:

function settype(&$object, $secondparameter) { 
    ...whatever the function does... 
} 

即在函數參數中使用&

此規則適用於所有情況下的PHP。正如我所說的,它與你的析構函數方法無關,或與它是一個對象無關;這就是你在現代PHP中通過引用傳遞的方式。

現在到問題的其他部分:析構函數方法。

PHP確實允許自動析構函數,你的類中這樣寫的:

function __destruct() { 
    print "Destroying " . $this->name . "\n"; 
} 

如果你寫的代碼中,__destruct()方法將被當對象被銷燬調用。這可能是也可能不是你想要的 - 取決於你希望如何工作。當對象的所有引用都未設置或超出範圍時,該對象將被銷燬。如果你通過引用傳遞對象句柄,這可能不會在你期望的時候發生 - 即,即使當你說unset($myobject);時,對象可能會在內存中持續存在。在這種情況下,PHP程序運行完成後,它可能只會被銷燬。如果是這種情況,並且您需要早於這種情況,那麼您可以繼續使用已有的方法,並將其稱爲「明確」。

希望能回答你的問題。

+0

+1用於解釋錯誤消息的背景 – 2010-10-29 16:46:52