2012-02-05 108 views
8

有没有这种方法不会被调用的情况?__destruct有多可靠?

我想在缓存对象被破坏之前将一个重要的变量存储到持久缓存中。这个变量是多次使用的页面,所以我不希望每次变量的变化与它更新缓存...

+1

这可能有帮助:http://stackoverflow.com/questions/151660/php-destruct-method – stewe 2012-02-05 20:32:23

+0

请注意,当脚本终止时,对象会以任意顺序销毁,因此如果将某些内容存储到持久缓存中,则需要访问一个预先初始化的“缓存处理程序对象”,这可能是一个问题... – jgivoni 2012-03-28 13:48:07

+0

可能的重复[何时将\ _ \ _ destruct不在PHP中调用?](http://stackoverflow.com/questions/2385047/when-将破坏不被称为在PHP) – 2013-06-03 08:19:38

回答

14

让我们有一个类:

class A { 
    public function __construct(){ 
     echo "Construct\n"; 
    } 

    public function __destruct(){ 
     echo "Destruct\n"; 
    } 
} 

和测试代码:

$test = new A(); 
die("Dead\n"); // Will output Construct; dead; Destruct 

$test = new A(); 
throw new Exception("Blah\n"); // Construct, Fatal error (no destruct) 

$test = new A(); 
require_once('invalid_file.php'); // Construct, Fatal error (no destruct) 

所以基本上:有情况(致命错误)时,析构函数将不会被调用。

啊,这问题有相同的答案,因为这一个:When will __destruct not be called in PHP?(+/-)

+3

个人而言,我会考虑更多的编程错误比PHP不可靠。这是一个糟糕的设计,无法捕捉抛出的异常。 – nickb 2012-02-05 20:35:14

+0

@nickb是的,你说得对,它的设计和编程失败了,但是像'include'fatal_error.php''这样的情况是真实的(特别是当你构建模块化应用程序时),这将是我的下一个测试,答案将会保留一样。 – Vyktor 2012-02-05 20:40:51

3

只要有对特定对象的更多引用,或在关机过程中调用它。该手册还指出,当脚本以exit()结尾时调用析构函数。

除了TimWolla指出的问题,我没有意识到任何PHP析构函数的问题。