Можете ли вы отменить регистрацию функции выключения?

Возможно ли в 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;