如果我有以下设置,我发现PHP5没有调用__destruct()函数:
class test { __destruct() { echo 'hehe'; exit; } } header('Location: http://test.com/'); exit;
它从不调用破坏函数
答案 0 :(得分:12)
destructor被称为:
使用标头重定向不会阻止析构函数被调用。
另请注意,析构函数在PHP脚本的末尾被调用 - 但不会阻止重定向,因为已经生成了“重定向”的标题。
例如,使用此代码:
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不会改变已经生成该头的事实。
哦,这是来自manual 的注释(引用 - 在页面底部):
注意:析构函数在调用期间调用 脚本关闭有HTTP标头 已发送。
这就是为什么你没有看到你的“hehe
”字符串:析构函数被调用;你只是在屏幕上看不到它; - )
这就是为什么我在我的例子中使用了一个文件,btw ;-)