3

如果我有以下设置,我发现 PHP5 不会调用 __destruct() 函数:

类测试{
 __destruct()
 {
  回声“呵呵”;
  出口;
 }
}

header('位置:http://test.com/');
出口;

它从不调用破坏函数

4

1 回答 1

12

析构函数被称为:

  • 对于您实例化的任何对象
    • 在您发布的脚本部分中,您没有实例化任何对象-也许这就是没有调用析构函数的原因?
  • 在 PHP 脚本的末尾

使用标头重定向不会阻止调用析构函数。


另请注意,在 PHP 脚本的末尾调用了析构函数——但不会阻止重定向,因为已经生成了标头“redirect”。

例如,使用此代码:

class Test {
    public function __destruct() {
        echo 'hehe';
        file_put_contents('/tmp/test-desctructor.txt', "glop\n");
        exit;
    }
}

$a = new Test();

header('Location: http://example.com/');
exit;

(请注意,我纠正了一些错误,并添加了该类的实际实例)

您不会hehe在输出中看到“”,但您会发现文件/tmp/test-desctructor.txt已创建:

$ cat /tmp/test-desctructor.txt
glop

如果要hehe在输出中获得“”,则需要删除重定向。


在生成头文件后调用析构函数——从析构函数调用 exit 不会改变该头文件已经生成的事实。

哦,这是手册中的注释 (引用 - 在页面底部)

注意:在脚本关闭期间调用的析构函数已经发送了 HTTP 标头。

这就是为什么你看不到你的 " hehe" 字符串:析构函数被调用了;你只是在屏幕上看不到它;-)

这就是我在示例中使用文件的原因,顺便说一句;-)

于 2009-09-21T21:24:00.507 回答