2010-07-15 66 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. 
相关问题