如果使用重定向,PHP5是否调用_destruct()?
如果我有以下设置,我发现PHP5没有调用_destruct()函数: class test { __destruct() { echo 'hehe'; exit; } } header('Location: http://test.com/'); exit; 课堂测试{ __自毁 { 呼应“呵呵”; 出口 } } 标题('位置:http://test.com/'); 出口 它从不调用析构函数调用:如果使用重定向,PHP5是否调用_destruct()?,php,destructor,Php,Destructor,如果我有以下设置,我发现PHP5没有调用_destruct()函数: class test { __destruct() { echo 'hehe'; exit; } } header('Location: http://test.com/'); exit; 课堂测试{ __自毁 { 呼应“呵呵”; 出口 } } 标题('位置:http://test.com/'); 出口 它从不调用析构函数调用: 对于您实例化的任何对象 在您发布的脚本部分中,您没有实例化任何对象——可能这就
- 对于您实例化的任何对象
- 在您发布的脚本部分中,您没有实例化任何对象——可能这就是没有调用析构函数的原因
- 在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 destructor.txt
已创建:
$ cat /tmp/test-desctructor.txt
glop
如果要获取输出上的“hehe
”,则需要删除重定向
在生成头之后调用析构函数——从析构函数调用exit不会改变头已经生成的事实 哦,这里有一个注释(引用——在页面底部): 注意:在调用过程中调用析构函数 脚本关闭具有HTTP头 已经发送了 这就是为什么你看不到你的“
hehe
”字符串:析构函数被调用;你只是在屏幕上看不到;-)
这就是我在示例中使用文件的原因,顺便说一句;-) 感谢您捕获对象实例。我确实是在我的剧本里写的。你的解释很清楚,谢谢你!