前言
最近在看《PHP核心技术与最佳实践》,里面有使用到一个函数,register_shutdown_function,由于之前没有用过该函数,就去查了一下资料,就觉得是个很实用的函数,所以这里写一下这个函数的用法。下面话不多说了,来一起看看详细的介绍吧。
1. 函数说明
定义:该函数是来注册一个会在PHP中止时执行的函数
参数说明:
void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )
注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。
callback:待注册的中止回调
parameter:可以通过传入额外的参数来将参数传给中止函数
2. PHP中止的情况
PHP中止的情况有三种:
a. 第一种情况,执行完成
<?php function test() { echo '这个是中止方法test的输出'; } register_shutdown_function('test'); echo 'before' . PHP_EOL;
运行:
before 这个是中止方法test的输出
注意:输出的顺序,等执行完成了之后才会去执行register_shutdown_function的中止方法test
b. 第二种情况,exit/die导致的中止
<?php function test() { echo '这个是中止方法test的输出'; } register_shutdown_function('test'); echo 'before' . PHP_EOL; exit(); echo 'after' . PHP_EOL;
运行:
before 这个是中止方法test的输出
后面的after并没有输出,即exit或者是die方法导致提前中止。
c. 第三种情况,发送致命错误中止
<?php function test() { echo '这个是中止方法test的输出'; } register_shutdown_function('test'); echo 'before' . PHP_EOL; // 这里会发生致命错误 $a = new a(); echo 'after' . PHP_EOL;
运行:
before Fatal error: Uncaught Error: Class 'a' not found in D:/laragon/www/php_book/test.php on line 12 Error: Class 'a' not found in D:/laragon/www/php_book/test.php on line 12 Call Stack: 0.0020 360760 1. {main}() D:/laragon/www/php_book/test.php:0 这个是中止方法test的输出
后面的after也是没有输出,致命错误导致提前中止了。
3. 参数
第一个参数支持以数组的形式来调用类中的方法,第二个以及后面的参数都是可以当做额外的参数传给中止方法。
<?php class Shutdown { public function stop() { echo "这个是stop方法的输出"; } } // 当PHP终止的时候(执行完成或者是遇到致命错误中止的时候)会调用new Shutdown的stop方法 register_shutdown_function([new Shutdown(), 'stop']); // 将因为致命错误而中止 $a = new a(); // 这一句并没有执行,也没有输出 echo '必须终止';
新闻热点
疑难解答