2010-07-15 72 views
10

PHP對象實例是否可以銷燬/取消自定義?假設我有一個代表一個文件的類,然後我使用該類刪除該文件。我能以某種方式從其自己的方法之一中取消設置實例嗎?類實例可以自毀嗎?

$file = new FileClass(); 

$file->copy('/some/new/path/'); 
$file->delete(); 

// ... at this point $file would be seen as unset. 
+1

了「是 - 和 - 這裏 - 是 - 如何」的答案基本上是類似的問題在這裏 - http://stackoverflow.com/a/21367011/1537018 – 2014-01-26 18:06:33

回答

14

不,不可能破壞一個不合邏輯的類。 unset($this)將不起作用(至少不如預期)。

你爲什麼不使用

unset($file); 

,並定義在其中執行,你會在delete正常執行任務的__destruct功能?

+0

這是我考慮過的事情。這種方法唯一的問題當然是可讀性。回顧5年後的這段代碼,或第一次看這個代碼的人,將無法知道調用unset()實際上是在刪除文件。 – Wilco 2010-07-15 23:52:36

+1

我認爲這確實是可以找到的最佳解決方案,所以我打算將其標記爲接受的答案。 – Wilco 2010-08-04 16:43:27

0

這是我能想到的唯一的解決辦法:

function delete($var_name) { 
    unset($GLOBALS[$var_name]); 
} 

然後你做:

$file->delete('file'); 

無論如何,一個類不能自殺(沒有幫助從外部)。

+6

如果'$ file'不在全局範圍內,雖然 – 2010-07-18 22:55:18

+0

加入'global $ {$ var_name};'應該解決該問題 – xorinzor 2013-03-15 13:54:32

+1

增加範圍爲了讓它收集垃圾的價值是倒退的。使它全局化會導致與同名的任何現有值發生衝突,並且允許更多的代碼訪問並因此依賴於該值。這使得*更難以移除。您的解決方案將刪除該值以及任何其他「文件」全局(預先存在或尚未添加),並打破任何其他用戶的任何這些值。 – Warbo 2014-08-07 16:56:48

4

或者,因此它被回收垃圾時不再使用,你可以限制$文件的範圍:

call_user_func(function() { 
    $file = new FileClass(); 
    $file->copy('/some/new/path/'); 
    $file->delete(); 
}); 

// ... at this point $file would be seen as unset.