【问题标题】:Does PHP5 call __destruct() if you use a redirect?如果您使用重定向,PHP5 会调用 __destruct() 吗?
【发布时间】:2010-11-30 05:26:16
【问题描述】:

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

类测试{ __destruct() { 回声“呵呵”; 出口; } } header('位置:http://test.com/'); 出口;

它从不调用破坏函数

【问题讨论】:

    标签: php destructor


    【解决方案1】:

    destructor 被称为:

    • 对于任何你已经实例化的对象
      • 在您发布的部分脚本中,您没有实例化任何对象——也许这就是没有调用析构函数的原因?
    • 在 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 不会改变该头文件已经生成的事实。

    哦,这是来自manual 的注释(引用 -- 在页面底部)

    注意:在 脚本关闭具有 HTTP 标头 已经发送了。

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

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

    【讨论】:

    • 感谢您捕获对象实例化。我确实在我的脚本中做到了。你的解释很清楚,谢谢!
    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2010-09-14
    • 2017-12-15
    相关资源
    最近更新 更多