Как передать функцию в качестве параметра другой функции?


У меня есть список функций a(), b(), c()
У меня есть функция main().

В зависимости от случая, мне нужно передать другую функцию main() для использования.
В javascript это будет:

var a = function(){}
var b = function(){}
var c = function(){}

var func = (some logic) a, b or c;

main(func);

Как это сделать в php5. 3?
Я пытаюсь избежать использования

$func_name = "a";
main($func_name){
   $func_name();
}

Или, может быть, это лучший способ, и я не должен использовать замыкания любого типа?

3 2

3 ответа:

Та же идея в PHP 5.3, как вы можете создать анонимные функции:

$sayHello = function($var)
{
    echo "Hello ", $var;
};

// Logic here to determine what $func is set to
$func = $sayHello;    

function callCustom($function)
{
    if(!is_callback($function))
    {
        // throw exception
    }
    $function("World");
}

callCustom($func);  // Hello World

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

$a = function(){};
$b = function(){};
$c = function(){};

switch (rand(0, 2)) {
    case 0: $func = $a; break;
    case 1: $func = $b; break;
    case 2: $func = $c; break;
}

var_dump($func);

Вы можете увидеть рабочий пример здесь http://codepad.viper-7.com/Ut5yGQ

Примечание: я использовал var_dump вместо main, поскольку main не определен

В PHP все, что "вызывается" (is_callableдокументы) может быть вызван (вызван). Руководство часто называет эти параметры так: Callback , псевдотип в PHPдокументы.

Вы можете использовать любой из различных обратных вызовов и передавать их в качестве параметра функции:

function main($callback)
{
    call_user_func($callback);
}

Тогда ваша функция будет работать с любым допустимым обратным вызовом PHP.

Кроме того, функции могут быть вызваны с переменными, некоторые примеры:

Вызов Переменной Функции:

  function name() {};
  $function = 'name'; # function name as string
  $function(); # invoke

анонимная функция как вызов переменной функции:

  $function = function() {}; # define function
  $function(); # invoke

Смотрите также переменные функциидокументы.