2010-04-28 38 views

回答

21

我不相信你可以。註銷回調函數的唯一方法是將其封裝在某種只根據特定條件實際調用它的類中。像這個方便的功能包裝:

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(); 

現在,調用的時候,它會返回錯誤,而不是調用回調函數。簡化這個過程可能有幾種方式,但是它可行。

簡化它的一種方法是將回調的實際註冊放入回調函數的方法中,這樣外界不必知道您必須傳遞給register_shutdown_function的方法是「call 」。

+0

在PHP 5.3或更高版本,你可以使用魔術方法「__invoke」,從而使該對象本身可以傳遞給'register_shutdown_function'。 – Brilliand 2014-01-04 00:51:18

1

您好我做了輕微修改我的函數擔任的方式如下:

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;