如果使用重定向,PHP5是否调用__destruct()函数?

3
我发现如果按下列方式设置,PHP5不会调用__destruct()函数:
class test {
 __destruct()
 {
  echo 'hehe';
  exit;
 }
}
header('Location: http://test.com/'); exit;
在这种情况下,__destruct()函数永远不会被调用。
1个回答

13

析构函数 被调用:

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

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


另请注意,析构函数在 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将无法改变已经生成的头文件的事实。
哦,这里有一个来自手册(在页面底部引用)的注释:

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

这就是为什么您看不到"hehe"字符串的原因:析构函数被调用了;您只是看不到它在屏幕上;-)
这就是为什么我在我的示例中使用了一个文件;-)

感谢您发现了对象实例化问题。事实上,我在我的脚本中确实这样做了。您的解释非常清晰,我非常感谢! - Brian Cray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接