php中__destruct與register_shutdown_function執(zhí)行的先后順序問題(2)_PHP教程
推薦:PHP圖片自動裁切應(yīng)付不同尺寸的顯示如果做過那種門戶站的朋友,肯定知道,一張圖片可能會在不同的地方顯示,大小不同,比例也不同, 如果只用一張圖的話,那么肯定會變形,而且在顯示小圖的地方,鏈接 大圖,又太浪費(fèi)了.....用縮略圖來處理,也不完美,因?yàn)槊總地方出現(xiàn)的比例 大小可能都不一樣 ,舉個例子! 請看上圖
且慢,我無法接受這個結(jié)果,按照這樣的結(jié)論,難道說腳本已經(jīng)結(jié)束后還可以再執(zhí)行__destruct?!因此,我還要繼續(xù)驗(yàn)證這個結(jié)論---去掉類中注冊register_shutdown_function,而保留全局register_shutdown_function:
代碼如下:
class A {
public function __destruct()
{
echo __class__,'::',__function__,'<br/>';
}
}
class B {
public function __construct()
{
$obj = new A;
}
public function __destruct()
{
echo __class__,'::',__function__,'<br/>';
}
}
register_shutdown_function(function(){echo 'global', '<br/>';});
輸出:
代碼如下:
A::__destruct
global
B::__destruct
結(jié)果令人茫然,A、B兩個類的析構(gòu)函數(shù)執(zhí)行順序無可質(zhì)疑,因?yàn)锽中調(diào)用了A,類A肯定比B先銷毀,但全局的register_shutdown_function函數(shù)又怎么夾在它們中間被執(zhí)行?!費(fèi)解。
按照手冊的解析,析構(gòu)函數(shù)也可在調(diào)用exit時(shí)執(zhí)行。
析構(gòu)函數(shù)即使在使用 exit()終止腳本運(yùn)行時(shí)也會被調(diào)用。在析構(gòu)函數(shù)中調(diào)用 exit() 將會中止其余關(guān)閉操作的運(yùn)行。
如果在函數(shù)中調(diào)用exit,它們又如何被調(diào)用的呢?
代碼如下:
class A {
public function __construct(){
register_shutdown_function(array($this, 'op'));
exit;
}
public function __destruct()
{
echo __class__,'::',__function__,'<br/>';
}
public function op()
{
echo __class__,'::',__function__,'<br/>';
}
}
class B {
public function __construct()
{
register_shutdown_function(array($this, 'op'));
$obj = new A;
}
public function __destruct()
{
echo __class__,'::',__function__,'<br/>';
}
public function op()
{
echo __class__,'::',__function__,'<br/>';
}
}
register_shutdown_function(function(){echo 'global', '<br/>';});
$b = new B;
輸出:
代碼如下:
global
B::op
A::op
B::__destruct
A::__destruct
這個順序與上述第三個例子相似,不同的且令人不可思議的是B類的析構(gòu)函數(shù)先于類A執(zhí)行,難道銷毀B后類A的所有引用才被全部銷毀?!不得而知。
結(jié)論:
1、盡量不要在腳本中將register_shutdown_function與__destruct混搭使用,它們的行為完全不可預(yù)測。
1、因?yàn)閷ο笤谙嗷ヒ�,因此我們無法測知對象幾時(shí)被銷毀,當(dāng)需要按順序輸出內(nèi)容時(shí),不應(yīng)把內(nèi)容放在析構(gòu)函數(shù)__destruct里;
2、盡量不要在類中注冊register_shutdown_function,因?yàn)樗捻樞螂y以預(yù)測(只有調(diào)用這個對象時(shí)才會注冊函數(shù)),而且__destruct完全可以代替register_shutdown_function;
3、如果需要在腳本退出時(shí)執(zhí)行相關(guān)動作,最好在腳本開始時(shí)注冊register_shutdown_function,并把所有動作放在一個函數(shù)里。
分享:PHP 抽象方法與抽象類abstract關(guān)鍵字介紹及應(yīng)用PHP 抽象方法與抽象類 abstract 關(guān)鍵字 abstract 關(guān)鍵字用于定義抽象方法與抽象類。 抽象方法 抽象方法指沒有方法體的方法,具體就是在方法聲明的時(shí)候沒有 {} 括弧以及其中的內(nèi)容,而是直接在聲明時(shí)在方法名后加上分號結(jié)束。 abstract 關(guān)鍵字用于定義抽象方法,語法:
- PHP圖片自動裁切應(yīng)付不同尺寸的顯示
- PHP 抽象方法與抽象類abstract關(guān)鍵字介紹及應(yīng)用
- PHP編碼轉(zhuǎn)換函數(shù)mb_convert_encoding與iconv用法
- SAE的storage服務(wù)使用方法
- php輸出控制的學(xué)習(xí)筆記
- Python簡單技巧和常用參考
- 使用Poco C++庫創(chuàng)建websocket安全訪問(wss)客戶端
- php刪除指定目錄下的相關(guān)文件實(shí)例
- PHP流程控制的替代語法示例
- PHP的三種類型的運(yùn)算符
- php實(shí)現(xiàn)mysql數(shù)據(jù)庫隨機(jī)重排例子
- PHP如何判斷一個gif圖片是否為動態(tài)圖片
- 相關(guān)鏈接:
復(fù)制本頁鏈接| 搜索php中__destruct與register_shutdown_function執(zhí)行的先后順序問題(2)
- 教程說明:
PHP教程-php中__destruct與register_shutdown_function執(zhí)行的先后順序問題(2)
。