1

在我寻找创建钩子系统的过程中,我发现 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 中的遗留代码?

4

0 回答 0