前言
最近在看《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 '必须终止';
也可以在类中执行:
<?php
class TestDemo {
public function __construct()
{
register_shutdown_function([$this, "f"], "hello");
}
public function f($str)
{
echo "class TestDemo->f():" . $str;
}
}
$demo = new TestDemo();
echo 'before' . PHP_EOL;
/**
运行:
before
class TestDemo->f():hello
*/
4. 同时调用多个
可以多次调用 register_shutdown_function,这些被注册的回调会按照他们注册时的顺序被依次调用。
不过注意的是,如果在第一个注册的中止方法里面调用exit方法或者是die方法的话,那么其他注册的中止回调也不会被调用。
代码:
<?php
/**
* 可以多次调用 register_shutdown_function,这些被注册的回调会按照他们注册时的顺序被依次调用。
* 注意:如果你在f方法(第一个注册的方法)里面调用exit方法或者是die方法的话,那么其他注册的中止回调也不会被调用
*/
/**
* @param $str
*/
function f($str) {
echo $str . PHP_EOL;
// 如果下面调用exit方法或者是die方法的话,其他注册的中止回调不会被调用
// exit();
}
// 注册第一个中止回调f方法
register_shutdown_function("f", "hello");
class TestDemo {
public function __construct()
{
register_shutdown_function([$this, "f"], "hello");
}
public function f($str)
{
echo "class TestDemo->f():" . $str;
}
}
$demo = new TestDemo();
echo 'before' . PHP_EOL;
/**
运行:
before
hello
class TestDemo->f():hello
注意:如果f方法里面调用了exit或者是die的话,那么最后的class TestDemo->f():hello不会输出
*/
5. 用处
该函数的作用:
析构函数:在PHP4的时候,由于类不支持析构函数,所以这个函数经常用来模拟实现析构函数
致命错误的处理:使用该函数可以用来捕获致命错误并且在发生致命错误后恢复流程处理
PHP定义字符串的四种方式详解这篇文章主要介绍了PHP定义字符串的四种方式,非常不错,具有参考借鉴价值,需要的朋友可以参考下
php 替换文章中的图片路径,下载图片到本地服务器的方法下面小编就为大家分享一篇php 替换文章中的图片路径,下载图片到本地服务器的方法,具有很好的参考价值,希望对大
PHP给源代码加密的几种方法汇总(推荐)下面小编就为大家分享一篇PHP给源代码加密的几种方法汇总(推荐),具有很好的参考价值,希望对大家有所帮助。一起
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法下面小编就为大家分享一篇php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法,具有很好的参考价值,希
浅析PHP类的反射来实现依赖注入过程这篇文章主要介绍了PHP类的反射来实现依赖注入过程以及相关知识点分享,对此有兴趣的朋友跟着小编学习下吧。
php删除一个路径下的所有文件夹和文件的方法php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达