PHP中的解构函数

时间:2010-10-29 16:09:34

标签: php

看了一些旧代码后:

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

打电话
$Cache->destroy();

但是在PHP 5.3中,我得到了 不推荐使用:第154行的/blah/-cache-.php已弃用调用时传递引用

我该怎么做?

3 个答案:

答案 0 :(得分:8)

删除&中的$this可以解决您的直接问题,但整个构造对我来说没有意义。如果从对象的上下文中销毁$this并不是无效的,那绝对不是好习惯。

要销毁一个对象,一个简单的

unset($Cache);

会做的。

如果想要在对象被销毁时执行东西,则应该在类中定义destructor。 (destroy()代码中的注释表示这不是重点。:)

答案 1 :(得分:2)

像正常一样摧毁对象。

unset($Cache);

我不知道为什么他们会在上面做那些令人讨厌的混乱。请记住,如果对象在不同位置有指针,则需要取消设置所有指针 - 而不仅仅是一行。 (单身就是一个例子)

答案 2 :(得分:1)

您获得的错误与析构函数无关。错误只是因为你试图在函数调用中通过引用传递$ this。

PHP曾经允许这样做,但在当前版本的PHP中,如果你想通过引用传递一些东西,你应该在函数声明中指定它。

因此,您的函数调用应如下所示:

settype($this, 'null');

(即没有&)。 (顺便说一下 - 字符串中的'null'这个词是你的意思吗?)

如果你想通过ref传递,你的函数应该是这样的:

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

即使用函数参数中的&

此规则适用于PHP中的所有情况。正如我所说的,它与你的析构函数方法无关,或者它与它是一个对象;这就是你在现代PHP中通过引用传递的方式。

现在转到问题的另一部分:析构函数方法。

PHP允许自动析构函数,在你的类中编写如下:

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

如果编写此代码,则在销毁对象时将调用__destruct()方法。这可能是您想要的也可能不是 - 取决于您希望它如何工作。当对象的所有引用都未设置或超出范围时,该对象将被销毁。如果你通过引用传递对象句柄,那么当你期望它时可能不会发生这种情况 - 即即使你说unset($myobject);,对象也可能在内存中存在。在这种情况下,它可能只在PHP程序完成运行时被实际销毁。如果是这种情况,并且您需要尽快调用它,那么您可以继续使用已经使用的destroy()方法,并将其称为明确方法。

希望能回答你的问题。