在我寻找创建钩子系统的过程中,我发现 wordpress 是一个很好的例子,我正在尝试模仿它add_action()
和do_action()
函数调用。
但是,在 wordpress 中,函数签名是:
add_action( $tag, $function_to_add, $priority, $accepted_args );
并且它需要$accepted_args
传递参数(默认为 1)才能do_action()
正确提升。
在我的类方法中,我看不出为什么$accepted_args
需要传递参数:
public function addAction($tag, $callback, $priority = 10)
{
if (empty($tag) || !is_callable($callback)) {
return $this;
}
if (!$this->getActionsMap()->contains($tag)) {
$this->getActionsMap()->add($tag, new CList());
}
$this->getActionsMap()->itemAt($tag)->add(array(
'callback' => $callback,
'priority' => (int)$priority,
));
return $this;
}
public function doAction($tag, $arg = null)
{
if (!$this->getActionsMap()->contains($tag)) {
return $this;
}
$actions = $this->getActionsMap()->itemAt($tag)->toArray();
$sort = array();
foreach ($actions as $action) {
$sort[] = (int)$action['priority'];
}
array_multisort($sort, $actions);
$args = array_slice(func_get_args(), 2);
array_unshift($args, $arg);
foreach ($actions as $action) {
call_user_func_array($action['callback'], $args);
}
return $this;
}
所以我想知道,是否有需要该参数的真正原因,这是我明显缺少的东西?还是仅仅是因为 wordpress 中的遗留代码?