2012-02-05 61 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析構函數的問題。