Возможно ли в PHP отменить регистрацию функции (или всех функций), настроенной с помощью register_shutdown_function()
?
Можете ли вы отменить регистрацию функции выключения?
Ответ 1
Я не верю, что ты можешь. Единственный способ отменить функцию обратного вызова - это обернуть ее в какой-то класс, который на самом деле называет ее только на определенных условиях. Подобно этой удобной оболочке функций:
class UnregisterableCallback{
// Store the Callback for Later
private $callback;
// Check if the argument is callable, if so store it
public function __construct($callback)
{
if(is_callable($callback))
{
$this->callback = $callback;
}
else
{
throw new InvalidArgumentException("Not a Callback");
}
}
// Check if the argument has been unregistered, if not call it
public function call()
{
if($this->callback == false)
return false;
$callback = $this->callback;
$callback(); // weird PHP bug
}
// Unregister the callback
public function unregister()
{
$this->callback = false;
}
}
Основное использование:
$callback = new UnregisterableCallback(array($object, "myFunc"));
register_shutdown_function(array($callback, "call"));
Отменить регистрацию
$callback->unregister();
Теперь, когда вызывается, он вернет false и не вызовет вашу функцию обратного вызова. Возможно, существует несколько способов упростить этот процесс, но он работает.
Одним из способов упрощения этой процедуры было бы поставить фактическую регистрацию обратного вызова в метод функции обратного вызова, поэтому внешнему миру не нужно знать, что метод, который вы должны передать в register_shutdown_function, - это "вызов",.
Ответ 2
Привет, я немного изменил способ работы моей функции следующим образом:
function onDie(){
global $global_shutdown;
if($global_shutdown){
//do shut down
}
}
$global_shutdown = true;
register_shutdown_function('onDie');
//do code stuff until function no longer needed.
$global_shutdown = false;