加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PHP中register_shutdown_function函数的基本先容与用法详解

发布时间:2021-03-14 21:03:16 所属栏目:编程 来源:网络整理
导读:媒介 最近在看《PHP焦点技能与最佳实践》,内里有行使到一个函数,register_shutdown_function,因为之前没有效过该函数,就去查了一下资料,就认为是个很适用的函数,以是这里写一下这个函数的用法。下面话不多说了,来一路看看具体的先容吧。 1. 函数声名
副问题[/!--empirenews.page--]

媒介

最近在看《PHP焦点技能与最佳实践》,内里有行使到一个函数,register_shutdown_function,因为之前没有效过该函数,就去查了一下资料,就认为是个很适用的函数,以是这里写一下这个函数的用法。下面话不多说了,来一路看看具体的先容吧。

1. 函数声名

界说:该函数是来注册一个会在PHP中止时执行的函数

参数声名:

注册一个 callback ,它会在剧本执行完成可能 exit() 后被挪用。

callback:待注册的中止回调

parameter:可以通过传入特另外参数来将参数传给中止函数

2. PHP中止的环境

PHP中止的环境有三种:

  • 执行完成
  • exit/die导致的中止
  • 产生致命错误中止

a. 第一种环境,执行完成

register_shutdown_function('test');

echo 'before' . PHP_EOL;

运行:

留意:输出的次序,等执行完成了之后才会去执行register_shutdown_function的中止要领test

b. 第二种环境,exit/die导致的中止

register_shutdown_function('test');

echo 'before' . PHP_EOL;
exit();
echo 'after' . PHP_EOL;

运行:

后头的after并没有输出,即exit可能是die要教育致提前中止。

c. 第三种环境,发送致命错误中止

register_shutdown_function('test');

echo 'before' . PHP_EOL;

// 这里会产生致命错误
$a = new a();

echo 'after' . PHP_EOL;

运行:

Fatal error: Uncaught Error: Class 'a' not found in D:laragonwwwphp_booktest.php on line 12

Error: Class 'a' not found in D:laragonwwwphp_booktest.php on line 12

Call Stack:
0.0020 360760 1. {main}() D:laragonwwwphp_booktest.php:0

这个是中止要领test的输出

后头的after也是没有输出,致命错误导致提前中止了。

3. 参数

第一个参数支持以数组的情势来挪用类中的要领,第二个以及后头的参数都是可以当做特另外参数传给中止要领。

class Shutdown
{
public function stop()
{
echo "这个是stop要领的输出";
}
}

// 当PHP终止的时辰(执行完成可能是碰着致命错误中止的时辰)会挪用new Shutdown的stop要领
register_shutdown_function([new Shutdown(),'stop']);

// 将由于致命错误而中止
$a = new a();

// 这一句并没有执行,也没有输出
echo '必需终止';

也可以在类中执行:

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要领的话,那么其他注册的中止回调也不会被挪用。 代码:

/**

  • @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,"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的时辰,因为类不支持析构函数,以是这个函数常常用来模仿实现析构函数

致命错误的处理赏罚:行使该函数可以用来捕捉致命错误而且在产生致命错误后规复流程处理赏罚

代码如下:

class Shutdown
{
public function stop()
{
echo 'Begin.' . PHP_EOL;
// 假若有产生错误(全部的错误,包吸收命和非致命)的话,获取最后产生的错误
if (error_get_last()) {
print_r(error_get_last());
}

// ToDo:产生致命错误后规复流程处理赏罚

// 中止后头的全部处理赏罚
die('Stop.');
}
}

// 当PHP终止的时辰(执行完成可能是碰着致命错误中止的时辰)会挪用new Shutdown的stop要领
register_shutdown_function([new Shutdown(),'stop']);

// 将由于致命错误而中止
$a = new a();

// 这一句并没有执行,也没有输出
echo '必需终止';

运行:

Error: Class 'a' not found in D:laragonwwwphp_book1_23_register_shutdown.php on line 31

Call Stack:
0.0060 362712 1. {main}() D:laragonwwwphp_book1_23_register_shutdown.php:0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读