2012-03-17 44 views
1

我正在爲php應用程序創建一個動作鉤子系統。 這是我迄今爲止所做的。 $where是鉤子的名稱 $priority決定在一個鉤子位置有多個動作時所遵循的順序。 (hook::execute()達到鉤位置時被調用,我的應用程序的核心運行在任何上癮行爲)鉤子系統的變量參數支持

class hooks{ 
    private $hookes;  
    function __construct() 
    { 
     $hookes=array();   
    } 
    function add_action($where,$callback,$priority=50) 
    { 
     if(!isset($this->hookes[$where])) 
      $this->hookes[$where]=array(); 
     $this->hookes[$where][$callback]=$priority; 
    } 
    function remove_action($where,$callback) 
    { 
     if(isset($this->hookes[$where][$callback])) 
      unset($this->hookes[$where][$callback]); 
    } 
    static function compare($a,$b) 
    { 
     return $a>$b?1:-1; 
    } 
    function execute($where) 
    { 
     if(isset($this->hookes[$where])&&is_array($this->hookes[$where])) 
     { 
      usort($this->hookes[$where],"hook::compare"); 
      foreach($this->hookes[$where] as $callback=>$priority) 
      { 
       call_user_func($callback); 
      } 
     } 
    } 
}; 

我的問題是怎樣做的execute($where)有它接受一個變量參數列表,並通過他們在call_user_func($callback); 對於不同的要執行的調用,可能會在回調中傳遞可變數量的參數。

回答

3

可以使用call_user_func_array功能,第二個參數是數組參數

+0

所以如果我通過'陣列( 「數據到過濾器」,一些-其他數據,3)'在call_user_func,它將調用功能回調爲'function_name(「data-to-filter」,some-other-data,3);'或'function_name(array(「data-to-filter」,some-other-data,3)); – 2012-03-17 08:25:39

+1

function_name(「data-to-filter」,some-other-data,3) – Slawek 2012-03-17 08:27:38

1

試試這個,

Change add_action($where,$callback,$priority=50) 

add_action($where,Callable $callback,$priority=50) (PHP 5.4) 
    add_action($where,$callback,$priority=50) (ALL) 

CHANGE

foreach($this->hookes[$where] as $callback=>$priority) 
{ 
    call_user_func($callback); 
} 

爲了

foreach($this->hookes[$where] as $callback=>$priority) 
{ 

    if(is_callable($callback)) 
    { 
     $callback(); 
    } 
    //call_user_func($callback); 
} 

示例代碼

$hooks = new hooks(); 
$hooks->add_action("WHERE",function() 
{ 
    //Callback Code 
},5); 
+0

謝謝。第一個答案讓我的代碼工作。 – 2012-03-17 10:24:24

+0

不用客氣..當你開始擁有大量的代碼時,這只是更清晰和更容易閱讀......:D – Baba 2012-03-18 14:51:24