2014-11-20 2 views
3

У меня есть функция в моем классе, которая принимает функцию обратного вызова в качестве аргумента.Как передать все аргументы моей функции обратного вызова?

Но я тогда хотел передать п дополнительные аргументы для обратного вызова:

$myClass->each(function($result,$arg1,$arg2,$arg3){ 

    echo $arg2; //expected: bar 

},'foo','bar',85); 

То, что я пытаюсь достичь:

class myClass { 

    public function each() { 

     $callback = func_get_arg(0); 
     $args = array_slice(func_get_args(), 1); //_____ 
               //  | 
     if (is_callable($callback)) {   //  | I have $args 
      foreach ($this->results as $result) {//  | But how can I pass 
        $callback($result,...$args); //  | them to $callback 
      }      //^    | as a set of args? 
     }       // |__________________| 
    } 

} 

пожалуйста, обратите внимание, что я используя php 5.4, поэтому я не могу использовать оператора ...

+1

просто измените свой обратный вызов, чтобы принять массив, затем вы можете напрямую передать результат func_get_args(). –

ответ

3

Ответ, я считаю, call_user_func_array. Я знаю, это кажется немного архаичным в эпоху оператора splat, но я думаю, что это лучший вариант в 5.4.

public function each() { 
    $callback = func_get_arg(0); 
    $args = func_get_args(); 

    if (is_callable($callback)) {    
     foreach ($this->results as $result) { 
       $args[0] = $result; 
       call_user_func_array($callback, $args); 
     }     
    }      
} 

Это просто перезаписывает первый элемент в $args (который мы не хотим, так или иначе) с соответствующим $result значением.