是否可以覆盖已设置的register_shutdown_function堆栈?类似于:
function f1(){
echo "f1";
}
function f2(){
echo "f2";
}
register_shutdown_function("f1");
echo "actions here";
register_shutdown_function("f2");
call_to_undefined_function(); // to "produce" the error在本例中,我希望脚本只调用f2()。这个是可能的吗?
发布于 2012-02-24 21:57:49
这是不可能的。PHP有一个userland PHPAPI函数,但这不会暴露给remove_user_shutdown_function代码。
发布于 2014-07-17 15:19:26
你不能直接这么做,但是总有一个变通的办法:
$first = register_cancellable_shutdown_function(function () {
echo "This function is never called\n";
});
$second = register_cancellable_shutdown_function(function () {
echo "This function is going to be called\n";
});
cancel_shutdown_function($first);输出:
$ php test.php
This function is going to be calledfunction register_cancellable_shutdown_function($callback)
{
return new cancellable_shutdown_function_envelope($callback);
}
function cancel_shutdown_function($envelope)
{
$envelope->cancel();
}
final class cancellable_shutdown_function_envelope
{
private $callback;
public function __construct($callback)
{
$this->callback = $callback;
register_shutdown_function(function () {
$this->callback && call_user_func($this->callback);
});
}
public function cancel()
{
$this->callback = false;
}
}发布于 2012-02-24 21:57:05
从register_shutdown_function()上的php doc page
可以对register_shutdown_function()进行多次调用,并且每次调用的顺序与注册时的顺序相同。如果在一个已注册的关闭函数中调用exit(),则处理将完全停止,并且不会调用任何其他已注册的关闭函数。
因此,这意味着如果只想调用函数f2,可以将其传递给异常处理程序中的exit()调用。对register_shutdown_function()的多次调用将按顺序调用所有函数,而不仅仅是最后注册的函数。由于似乎没有任何类型的unregister_shutdown_function(),这就是我的建议。
https://stackoverflow.com/questions/9431843
复制相似问题