register_shutdown_function這個函式是在PHP程式執行結束之前呼叫的,用這個函式可以做很多,比如呼叫執行發生致命錯誤中止的原因,或者除錯程式的執行時間等。
PHP終止的情況有哪些呢?
一、執行完成(等執行完成了之後才會去執行register_shutdown_function的中止方法testFun)
<?php
function testFun() { echo '程式執行完成執行testFun方法'; } register_shutdown_function('testFun'); echo '測試一下----' . '<br>';
測試一下---- //結果 程式執行完成執行testFun方法 //在執行完最後一行程式碼,呼叫函式
二、exit/die導致的中止(後面的=====測試一下-----沒有輸出,即exit或者是die方法導致提前中止)
<?php
function testFun() { echo '程式終止執行testFun方法'; } register_shutdown_function('testFun'); echo '-----測試一下----' . '<br>'; exit(); echo '=====測試一下----' . '<br>';
-----測試一下---- 程式終止執行testFun方法 //終止的時候執行
三、發生致命錯誤中止
<?php function testFun() { echo '程式發生致命錯誤執行testFun方法'; } register_shutdown_function('testFun'); echo '-----測試一下----' . '<br>'; undefinedFunc (); //呼叫未定義函式 echo '=====測試一下----' . '<br>';
-----測試一下---- Fatal error: Call to undefined function undefinedFunc() in D:\phpStudy\WWW\miaosha\web\index.php on line 12 程式發生致命錯誤執行testFun方法
稍微複雜一點,陣列形式傳參
呼叫指定類中的方法
<?php class TestClass { function testFun() { echo '終止呼叫類中的方法'; } } register_shutdown_function([new TestClass(), 'testFun']); echo '測試一下' . '<br>';
測試一下
終止呼叫類中的方法
例項化引數傳遞,類方法中呼叫
<?php class TestClass { public $str = ''; public function __construct ($str = '') { $this->str = $str; register_shutdown_function([$this, 'testFun'], 'StrParam'); } function testFun($StrParam = '') { echo $this->str . '<br>'; echo '終止呼叫類中的方法' . '<br>'; echo $StrParam . '<br>'; } } $demo = new TestClass('this->str'); echo '程式結束了' . '<br>';
程式結束了 this->str 終止呼叫類中的方法 StrParam
多個註冊方法使用
<?php function testFun1 ($strParam1 = '') { echo '第一個測試方法' . $strParam1; echo '<br>'; } register_shutdown_function('testFun1', 'strParam1'); class TestClass { public function __construct () { register_shutdown_function([$this, 'testFun'], 'StrParam'); } function testFun($StrParam = '') { undefinedFunc(); //呼叫未定義函式 echo '第二個測試方法' . '<br>'; echo $StrParam . '<br>'; } } $demo = new TestClass(); echo '程式結束了' . '<br>';
程式結束了 第一個測試方法strParam1 Fatal error: Call to undefined function undefinedFunc() in D:\phpStudy\WWW\miaosha\web\index.php on line 21
以下情況自己測試下
<?php function testFun1 ($strParam1 = '') { echo '第一個測試方法' . $strParam1; echo '<br>'; // exit(); //自己測試下 } register_shutdown_function('testFun1', 'strParam1'); class TestClass { public function __construct () { register_shutdown_function([$this, 'testFun'], 'StrParam'); } function testFun($StrParam = '') { // undefinedFunc(); //呼叫未定義函式 echo '第二個測試方法' . '<br>'; echo $StrParam . '<br>'; // exit(); //自己測試下 } } $demo = new TestClass(); echo '程式結束了' . '<br>';