有什么意义在析构函数中取消设置($ this)吗?

时间:2011-04-01 14:26:14

标签: php

我遇到了一个班级,我的注意力立刻就是这个:

public function __destruct() {
        unset($this);
    }

我的第一个想法是,这只是简单的愚蠢,事实上它看起来很愚蠢,我认为要么真的有这么好的理由,要么作者只是无能为力

有什么想法?有什么理由这样做吗?

6 个答案:

答案 0 :(得分:16)

简答:否

答案很长:Noooooooooooooooooooooo

答案 1 :(得分:6)

  

我的第一个想法是,这只是简单的愚蠢,事实上它看起来如此愚蠢,我   我认为要么真的有理由这样做,要么作者只是一无所知。

后者,我担心:在破坏实例时没有任何意义。可能原始程序员是明确的忠实粉丝,但最糟糕的是这甚至不起作用:

<?php
class Foo {
    function __destruct( ) {
        unset( $this );
    }
}

$foo = new Foo;
$foo->__destruct( );
var_dump( $foo );

答案 2 :(得分:2)

鉴于析构函数仅在unset($object)或未引用对象的垃圾集合上调用,内部unset($this)的有用性是非常自我解释的。

特别是它本身没有效果,因为它只清除名称引用$this。它不释放占用的内存,这是在析构函数离开后发生的。

相比之下,使用有时是明智的:

unset($this->subobject);

这可能是作者在这里错误记录和误用的。

答案 3 :(得分:1)

我无法想到这一点。也许向开发者询问一下。

答案 4 :(得分:0)

考虑到要调用__destruct方法的触发器,我看不出这一点。来自http://www.php.net/manual/en/language.oop5.decon.php

  

只要删除了对特定对象的所有引用,或者在关闭序列中明确销毁对象或以任何顺序,就会调用析构函数方法。

另请注意,即使手动调用__destruct方法,它也可能无法达到预期效果。来自http://php.net/manual/en/function.unset.php

  

从PHP 5开始,无法在对象方法中取消设置$ this。

一些测试显示,所有这一切都将删除__destruct方法中对象的当前$ this引用。

答案 5 :(得分:0)

在互联网上找到这个。

  

unset($ this)只会从变量空间中删除$ this   当前功能范围。该对象将保留在调用者范围内。

     

然而,您可以执行$ this = null来覆盖对象。

http://bytes.com/topic/php/answers/459538-oop-unset-maybe-unset#post1762212