我正在为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);
对于要执行的不同调用,可能会在回调中传递可变数量的参数。
答案 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);