如果我有以下设置,我发现 PHP5 不会调用 __destruct() 函数:
类测试{ __destruct() { 回声“呵呵”; 出口; } } header('位置:http://test.com/'); 出口;
它从不调用破坏函数
如果我有以下设置,我发现 PHP5 不会调用 __destruct() 函数:
类测试{ __destruct() { 回声“呵呵”; 出口; } } header('位置:http://test.com/'); 出口;
它从不调用破坏函数
析构函数被称为:
使用标头重定向不会阻止调用析构函数。
另请注意,在 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
" 字符串:析构函数被调用了;你只是在屏幕上看不到它;-)
这就是我在示例中使用文件的原因,顺便说一句;-)