Поддержка переменных аргументов для системы ловушек - PullRequest
1 голос
/ 17 марта 2012

Я создаю систему ловушек для приложения 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); Для выполнения различных вызовов может быть переменное число параметров, которые должны быть переданы в обратном вызове.

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

Вы можете использовать функцию call_user_func_array , второй аргумент - массив с аргументами

1 голос
/ 17 марта 2012

Попробуйте это,

  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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...