国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

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

2024-05-04 21:54:24
字體:
來源:轉載
供稿:網友

 根據php手冊的解析。

__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';});
    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先執行。

共2頁上一頁12下一頁
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巫山县| 宜春市| 扎鲁特旗| 灵武市| 阿合奇县| 米泉市| 鹤庆县| 太康县| 霍山县| 准格尔旗| 庄河市| 兴海县| 监利县| 湖口县| 和平区| 白城市| 正镶白旗| 图木舒克市| 筠连县| 林周县| 玉环县| 滦南县| 犍为县| 鹿邑县| 比如县| 江西省| 郴州市| 蓝田县| 永靖县| 敖汉旗| 浦东新区| 乐昌市| 河南省| 松江区| 天津市| 增城市| 台中市| 上高县| 菏泽市| 肇州县| 龙海市|