析构函数和register_shutdown_function执行先后问题

析构函数和register_shutdown_function执行先后问题

析构函数/__destruct()

__destruct ( void ) : void

简介

当对象结束其生命周期时
e.g: 对象所在的函数已调用完毕
系统自动执行析构函数

register_shutdown_function

register_shutdown_function ( callable $callback [, mixed $... ] ) : void

简介

在脚本执行完成或调用 exit() 之后注册要执行的回调

可以多次调用 register_shutdown_function()
并且每次调用的顺序都与注册时的顺序相同 如果在一个已注册的关闭函数中调用 exit() 则处理完全关闭
并且不会调用其他注册的关闭函数

析构函数和register_shutdown_function执行先后问题

猜想

首先根据第一反应 register_shutdown_function是在脚本执行完成后调用
应该是在析构函数之后执行

测试版本

屏幕快照 2019-10-12 12.32.33.png

第一轮验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
register_shutdown_function('shutdown');
class Test{
protected $name;

public function __construct($name)
{
$this->name = $name;
}
public function __destruct()
{
echo "__destrcut()\n";
}
}

function shutdown()
{
echo "register_shutdown_function()\n";
}

$a = new Test('dd');
unset($a);

第一轮输出结果

屏幕快照 2019-10-12 12.01.39.png

第一轮结论

析构函数 确实会比 register_shutdown_function 先执行

第二轮验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class Test{
protected $name;

public function __construct($name)
{
$this->name = $name;
register_shutdown_function('shutdown');
}
public function __destruct()
{
echo "__destrcut()\n";
}
}

function shutdown()
{
echo "register_shutdown_function()";
}

$a = new Test('dd');
unset($a);

第二轮输出结果

屏幕快照 2019-10-12 12.01.39.png

第二轮结论

析构函数 确实会比 register_shutdown_function 先执行

第三轮验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class Test{
protected $name;

public function __construct($name)
{
$this->name = $name;
register_shutdown_function('shutdown');
}
public function __destruct()
{
echo "__destrcut()\n";
}
}

function shutdown()
{
echo "register_shutdown_function()\n";
}

$a = new Test('dd');

第三轮输出结果

屏幕快照 2019-10-12 12.38.33.png

第三轮结论

这种情况竟然是 register_shutdown_function() 先执行

总结

经过个人有限的能力验证 得出
析构函数和register_shutdown_function 的执行顺序并不是肯定的
在明确unset()对象 析构函数先执行
否则 register_shutdown_function 先执行
建议不要在同一脚本内使用 容易混乱

欢迎更正不足及错误🙇🏻‍♂️

# PHP

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×