钩子系统的变量参数支持

时间:2012-03-17 08:18:30

标签: php web-applications hook

我正在为php应用程序创建一个action-hook系统。 这是我到目前为止所做的。 $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); 对于要执行的不同调用,可能会在回调中传递可变数量的参数。

2 个答案:

答案 0 :(得分:3)

您可以使用call_user_func_array函数,第二个参数是带参数的数组

答案 1 :(得分: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);