亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php中__destruct與register_shutdown_function執行的先后順序問題

2020-03-22 18:12:19
字體:
來源:轉載
供稿:網友
PHP php中__destruct與register_shutdown_function執行的先后順序問題
__destruct是析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行。而register_shutdown_function是Registers a callback to be executed after script execution finishes or exit() is called. 注冊一個回調函數,此函數在腳本運行完畢或調用exit()時執行。從字面上理解,__destruct是對象層面的,而register_shutdown_function是整個腳本層面的,理應register_shutdown_function的級別更高,其所注冊的函數也應最后執行。為證實我們的猜測,我們寫一段腳本:復制代碼 代碼如下:
register_shutdown_function(function(){echo 'global';});
html' target='_blank'>class A {
public function __construct(){
}
public function __destruct()
{
echo __class__,'::',__function__,' br/
}
}
new A;
執行結果:復制代碼 代碼如下:
A::__destruct
global
完全證實了我們的猜測,它按照對象- 腳本的順序被執行了。但如果我們在對象中注冊了register_shutdown_function呢?它還是一樣的順序嗎?!復制代碼 代碼如下:
class A {
public function __construct(){
register_shutdown_function(function(){echo 'local', ' br/ });
}
public function __destruct()
{
echo __class__,'::',__function__,' br/
}
}
new A;
結果:復制代碼 代碼如下:
local
A::__destruct
可以看到register_shutdown_function先被調用了,最后才是執行對象的__destruct。這表明register_shutdown_function注冊的函數被當作類中的一個方法?!不得而知,這可能需要查看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函數,在類AB中又各注冊了一個,而且類中分別還有析構方法。最后運行結果會怎樣呢?復制代碼 代碼如下:
global
B::op
A::op
A::__destruct
B::__destruct
結果完全顛覆了我們的想像,register_shutdown_function函數無論在類中注冊還是在全局注冊,它都是先被執行,類中執行的順序就是它們被注冊的先后順序。如果我們再仔細研究,全局的register_shutdown_function函數無論放在前面還是后面都是這個結果,事情似乎有了結果,那就是register_shutdown_function比__destruct先執行,全局的register_shutdown_function函數又先于類中注冊的register_shutdown_function先執行。且慢,我無法接受這個結果,按照這樣的結論,難道說腳本已經結束后還可以再執行__destruct?!因此,我還要繼續驗證這個結論---去掉類中注冊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
結果令人茫然,A、B兩個類的析構函數執行順序無可質疑,因為B中調用了A,類A肯定比B先銷毀,但全局的register_shutdown_function函數又怎么夾在它們中間被執行?!費解。按照手冊的解析,析構函數也可在調用exit時執行。析構函數即使在使用 exit()終止腳本運行時也會被調用。在析構函數中調用 exit() 將會中止其余關閉操作的運行。如果在函數中調用exit,它們又如何被調用的呢?復制代碼 代碼如下:
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類的析構函數先于類A執行,難道銷毀B后類A的所有引用才被全部銷毀?!不得而知。結論:
1、盡量不要在腳本中將register_shutdown_function與__destruct混搭使用,它們的行為完全不可預測。
1、因為對象在相互引用,因此我們無法測知對象幾時被銷毀,當需要按順序輸出內容時,不應把內容放在析構函數__destruct里;
2、盡量不要在類中注冊register_shutdown_function,因為它的順序難以預測(只有調用這個對象時才會注冊函數),而且__destruct完全可以代替register_shutdown_function;
3、如果需要在腳本退出時執行相關動作,最好在腳本開始時注冊register_shutdown_function,并把所有動作放在一個函數里。
敬請大家指正。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频在线观看免费网址| 国产精品午夜视频| 国产视频观看一区| 亚洲深夜福利在线| 97热精品视频官网| 26uuu亚洲伊人春色| 日韩成人在线免费观看| 91精品国产高清久久久久久久久| 中文字幕精品影院| 午夜精品久久久久久久99热| 91影视免费在线观看| 亚洲一区二区久久久| 国产精品男人爽免费视频1| 久久久精品中文字幕| 91在线视频九色| 日韩一区二区三区在线播放| 91老司机精品视频| 欧美激情亚洲激情| 亚洲aⅴ日韩av电影在线观看| 日本精品中文字幕| 国产区亚洲区欧美区| 亚洲视频欧美视频| 国产精品久久久久久久久久小说| 国产精品99久久99久久久二8| 亚洲欧美国产精品va在线观看| 国产一区二区三区毛片| 亚洲国产91色在线| 色综合导航网站| 精品色蜜蜜精品视频在线观看| 精品国内自产拍在线观看| 97成人在线视频| 欧美贵妇videos办公室| 国产日本欧美一区| 黑人极品videos精品欧美裸| 久久韩国免费视频| 国产精品a久久久久久| 最近2019好看的中文字幕免费| 亚洲欧美激情另类校园| 欧美高清视频免费观看| 日韩中文字幕精品视频| 美女av一区二区| 日韩精品视频在线| 国产999精品久久久| 亚洲一区二区三区乱码aⅴ| 日韩欧美在线视频日韩欧美在线视频| 日韩**中文字幕毛片| 亚洲图片欧洲图片av| 国产成人免费av电影| 久色乳综合思思在线视频| 亚洲自拍另类欧美丝袜| 久久国产精品99国产精| 亚洲一区二区三区视频播放| 国产精品久久久久久久久久东京| 国产精品激情av在线播放| 国产精品男女猛烈高潮激情| 成人国产精品日本在线| 91香蕉嫩草神马影院在线观看| 91av视频在线观看| 91国产美女在线观看| 色樱桃影院亚洲精品影院| 91美女高潮出水| 亚洲欧美一区二区精品久久久| 欧美成人亚洲成人| 在线观看精品国产视频| 国产亚洲一区二区精品| 欧美日韩性生活视频| 亚洲大胆美女视频| 日本三级韩国三级久久| 日韩欧美a级成人黄色| 亚洲精品综合精品自拍| 精品美女永久免费视频| 日韩av在线网页| 日韩欧美国产黄色| 国产精品一区二区久久久久| 91久久精品日日躁夜夜躁国产| 久久伊人精品一区二区三区| 国产精品影片在线观看| 亚洲国产天堂网精品网站| 美女啪啪无遮挡免费久久网站| 97精品一区二区视频在线观看| 欧美激情亚洲另类| 日韩精品高清视频| 97视频在线观看网址| 亚洲摸下面视频| 色综合亚洲精品激情狠狠| 亚洲国产精品久久精品怡红院| 亚洲高清av在线| 91影院在线免费观看视频| 91亚洲va在线va天堂va国| 久久久久久久香蕉网| 国产在线观看精品一区二区三区| 欧美性受xxxx白人性爽| 亚洲一区二区三区视频| 久操成人在线视频| 亚洲精品久久久久中文字幕二区| 亚洲国产精品一区二区久| 国产在线观看一区二区三区| 尤物yw午夜国产精品视频明星| 日韩视频永久免费观看| 亚洲第一网站男人都懂| 久久久久久欧美| 日韩国产精品亚洲а∨天堂免| 欧美日韩999| 久久精品国产亚洲| 国产精品视频午夜| 亚洲男人天堂视频| 欧美第一页在线| 久久久久久久激情视频| 亚洲性69xxxbbb| 久久天天躁狠狠躁夜夜av| 国产日韩换脸av一区在线观看| 国产999在线观看| 欧洲成人在线观看| 亚洲精品aⅴ中文字幕乱码| 91理论片午午论夜理片久久| 欧美福利视频网站| 久久夜色撩人精品| 日韩av网址在线观看| 亚洲女人初尝黑人巨大| 久久精品国产亚洲一区二区| 国产成人精品在线播放| 欧洲成人在线观看| 国产精品日韩欧美大师| 国产精品27p| 日韩av中文字幕在线免费观看| 伊人久久久久久久久久久久久| 午夜精品久久久久久久白皮肤| 欧美激情国产日韩精品一区18| 在线成人激情视频| 91精品国产综合久久久久久蜜臀| 中文字幕日韩视频| 91精品视频免费看| 国产视频精品久久久| 伊人伊成久久人综合网站| 亚洲午夜未删减在线观看| 国产精品高潮呻吟久久av黑人| 97久久精品国产| 久久久久99精品久久久久| 欧美日韩在线看| 成人精品网站在线观看| 欧美在线影院在线视频| 日本成人激情视频| 国产精品免费网站| 一区二区欧美激情| 在线国产精品播放| 欧美大片在线看| 国产精品白嫩初高中害羞小美女| 国产精品久久国产精品99gif| 久久久久成人精品| 亚洲精品成a人在线观看| 97久久精品人搡人人玩| 国产精品久久久久9999| 国产欧美在线视频| 国产精品91免费在线| 国产精品视频精品| 久热精品在线视频| 日本不卡高字幕在线2019| 国产视频精品一区二区三区| 欧美大尺度在线观看| 一区二区三区四区视频| 久久精品影视伊人网| 亚洲电影天堂av| 成人激情在线播放| 亚洲影院色无极综合|