Возможно ли в PHP отменить регистрацию функции (или всех функций), созданной с помощью register_shutdown_function()
?
Я не верю, что ты можешь. Единственный способ отменить функцию обратного вызова – это обернуть ее в какой-то класс, который на самом деле называет ее только на определенных условиях. Подобно этой удобной оболочке функций:
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, является «вызовом».
Привет, я немного изменил способ работы моей функции следующим образом:
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;