代码之家  ›  专栏  ›  技术社区  ›  nickf

你能注销关机功能吗?

php
  •  24
  • nickf  · 技术社区  · 14 年前

    在php中是否可以取消注册用 register_shutdown_function() ?

    2 回复  |  直到 9 年前
        1
  •  23
  •   Tyler Carter    14 年前

    我不相信你能。取消注册回调函数的唯一方法是将其包装在某种类中,该类仅根据特定条件实际调用回调函数。就像这个方便的函数包装:

    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而不调用回调函数。可能有一些方法可以简化这个过程,但它是有效的。

    一种简化方法是将回调的实际注册放入回调函数的方法中,这样外部世界就不必知道注册关闭函数所需传递的方法是“call”。

        2
  •  2
  •   GodLovesYou    9 年前

    嗨,我对我的函数的工作方式做了一个小小的修改,如下所示:

    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;