php中__destruct与register_shutdown_function执行的先后顺序问题
这篇文章主要介绍了php中__destruct与register_shutdown_function执行的先后顺序问题,需要的朋友可以参考下
根据php手册的解析。
__destruct是
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
而register_shutdown_function是
Registers a callback to be executed after script execution finishes or exit() is called. 注册一个回调函数,此函数在脚本运行完毕或调用exit()时执行。
从字面上理解,__destruct是对象层面的,而register_shutdown_function是整个脚本层面的,理应register_shutdown_function的级别更高,其所注册的函数也应最后执行。为证实我们的猜测,我们写一段脚本:
复制代码 代码如下:
register_shutdown_function(function(){echo 'global';});
class A {
public function __construct(){
}
public function __destruct()
{
echo __class__,'::',__function__,'
';
}
}
new A;
执行结果:
复制代码 代码如下:
A::__destruct
global
完全证实了我们的猜测,它按照对象->脚本的顺序被执行了。
但如果我们在对象中注册了register_shutdown_function呢?它还是一样的顺序吗?!
复制代码 代码如下:
class A {
public function __construct(){
register_shutdown_function(function(){echo 'local', '
';});
}
public function __destruct()
{
echo __class__,'::',__function__,'
';
}
}
new A;
结果:
复制代码 代码如下:
local
A::__destruct
可以看到register_shutdown_function先被调用了,,最后才是执行对象的__destruct。这表明register_shutdown_function注册的函数被当作类中的一个方法?!不得而知,这可能需要查看php源代码才能解析了。
我们可以扩大范围查看情况:
复制代码 代码如下:
register_shutdown_function(function(){echo 'global', '
';});
class A {
public function __construct(){
register_shutdown_function(array($this, 'op'));
}
public function __destruct()
{
echo __class__,'::',__function__,'
';
}
public function op()
{
echo __class__,'::',__function__,'
';
}
}
class B {
public function __construct()
{
register_shutdown_function(array($this, 'op'));
$obj = new A;
}
public function __destruct()
{
echo __class__,'::',__function__,'
';
}
public function op()
{
echo __class__,'::',__function__,'
';
}
}
$b = new B;
我们在全局注册一个register_shutdown_function函数,在类AB中又各注册了一个,而且类中分别还有析构方法。最后运行结果会怎样呢?
复制代码 代码如下:
global
B::op
A::op
A::__destruct
B::__destruct
结果完全颠覆了我们的想像,register_shutdown_function函数无论在类中注册还是在全局注册,它都是先被执行,类中执行的顺序就是它们被注册的先后顺序。如果我们再仔细研究,全局的register_shutdown_function函数无论放在前面还是后面都是这个结果,事情似乎有了结果,那就是register_shutdown_function比__destruct先执行,全局的register_shutdown_function函数又先于类中注册的register_shutdown_function先执行。
下一篇: 七牛云。音视频拼接问题
推荐阅读
-
php中__destruct与register_shutdown_function执行的先后顺序问题
-
php中time()和date()函数获取时间与本地不一致的问题
-
__destruct与register_shutdown_function执行的先后顺序问题,destruct_PHP教程
-
php-mysql 问题笔记一——在命令行中可以执行的sql语句,无法从php页面页面执行!
-
php中__destruct与register_shutdown_function执行的先后顺序问题_PHP
-
php中的路径问题与set_include_path使用介绍_PHP教程
-
解决php include中绝对路径与相对路径的有关问题
-
php中的路径问题与set_include_path
-
JavaScript中关于代码执行的先后顺序问题详解
-
求助PHP中session与数据库的问题