Как передать функцию в качестве параметра другой функции? - PullRequest
2 голосов
/ 23 декабря 2011

У меня есть список функций 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 голосов
/ 23 декабря 2011

Та же идея в 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
0 голосов
/ 23 декабря 2011

В PHP можно вызывать (вызывать) все, что можно вызвать (is_callable & shy; Docs ). В руководстве часто эти параметры называются Callback , псевдотип в PHP & shy; Документы .

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

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

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

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

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

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

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

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

См. Также Функции переменных & shy; Документы .

0 голосов
/ 23 декабря 2011

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

$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 не определено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...