php中__destruct與register_shutdown_function執(zhí)行的先后順序問題_PHP教程
推薦:PHP圖片自動裁切應(yīng)付不同尺寸的顯示如果做過那種門戶站的朋友,肯定知道,一張圖片可能會在不同的地方顯示,大小不同,比例也不同, 如果只用一張圖的話,那么肯定會變形,而且在顯示小圖的地方,鏈接 大圖,又太浪費了.....用縮略圖來處理,也不完美,因為每個地方出現(xiàn)的比例 大小可能都不一樣 ,舉個例子! 請看上圖
根據(jù)php手冊的解析。
__destruct是
析構(gòu)函數(shù)會在到某個對象的所有引用都被刪除或者當(dāng)對象被顯式銷毀時執(zhí)行。
而register_shutdown_function是
Registers a callback to be executed after script execution finishes or exit() is called. 注冊一個回調(diào)函數(shù),此函數(shù)在腳本運行完畢或調(diào)用exit()時執(zhí)行。
從字面上理解,__destruct是對象層面的,而register_shutdown_function是整個腳本層面的,理應(yīng)register_shutdown_function的級別更高,其所注冊的函數(shù)也應(yīng)最后執(zhí)行。為證實我們的猜測,我們寫一段腳本:
代碼如下:
register_shutdown_function(function(){echo 'global';});
class A {
public function __construct(){
}
public function __destruct()
{
echo __class__,'::',__function__,'<br/>';
}
}
new A;
執(zhí)行結(jié)果:
代碼如下:
A::__destruct
global
完全證實了我們的猜測,它按照對象->腳本的順序被執(zhí)行了。
但如果我們在對象中注冊了register_shutdown_function呢?它還是一樣的順序嗎?!
代碼如下:
class A {
public function __construct(){
register_shutdown_function(function(){echo 'local', '<br/>';});
}
public function __destruct()
{
echo __class__,'::',__function__,'<br/>';
}
}
new A;
結(jié)果:
復(fù)制代碼 代碼如下:
local
A::__destruct
可以看到register_shutdown_function先被調(diào)用了,最后才是執(zhí)行對象的__destruct。這表明register_shutdown_function注冊的函數(shù)被當(dāng)作類中的一個方法?!不得而知,這可能需要查看php源代碼才能解析了。
我們可以擴大范圍查看情況:
代碼如下:
register_shutdown_function(function(){echo 'global', '<br/>';});
class A {
public function __construct(){
register_shutdown_function(array($this, 'op'));
}
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/>';
}
}
$b = new B;
我們在全局注冊一個register_shutdown_function函數(shù),在類AB中又各注冊了一個,而且類中分別還有析構(gòu)方法。最后運行結(jié)果會怎樣呢?
代碼如下:
global
B::op
A::op
A::__destruct
B::__destruct
結(jié)果完全顛覆了我們的想像,register_shutdown_function函數(shù)無論在類中注冊還是在全局注冊,它都是先被執(zhí)行,類中執(zhí)行的順序就是它們被注冊的先后順序。如果我們再仔細(xì)研究,全局的register_shutdown_function函數(shù)無論放在前面還是后面都是這個結(jié)果,事情似乎有了結(jié)果,那就是register_shutdown_function比__destruct先執(zhí)行,全局的register_shutdown_function函數(shù)又先于類中注冊的register_shutdown_function先執(zhí)行。
分享:PHP 抽象方法與抽象類abstract關(guān)鍵字介紹及應(yīng)用PHP 抽象方法與抽象類 abstract 關(guān)鍵字 abstract 關(guān)鍵字用于定義抽象方法與抽象類。 抽象方法 抽象方法指沒有方法體的方法,具體就是在方法聲明的時候沒有 {} 括弧以及其中的內(nèi)容,而是直接在聲明時在方法名后加上分號結(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)文件實例
- PHP流程控制的替代語法示例
- PHP的三種類型的運算符
- php實現(xiàn)mysql數(shù)據(jù)庫隨機重排例子
- PHP如何判斷一個gif圖片是否為動態(tài)圖片
- 相關(guān)鏈接:
復(fù)制本頁鏈接| 搜索php中__destruct與register_shutdown_function執(zhí)行的先后順序問題
- 教程說明:
PHP教程-php中__destruct與register_shutdown_function執(zhí)行的先后順序問題。