Подтвердить что ты не робот

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

Возможно ли в PHP отменить регистрацию функции (или всех функций), настроенной с помощью register_shutdown_function()?

4b9b3361

Ответ 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;