Могу ли я вызвать функцию, имя которой хранится в переменной? - PullRequest
0 голосов
/ 25 января 2011

Я кодирую IRC-бота, и в нем есть массив, содержащий команды, и действие для каждой команды.

Например, сохраненное действие может быть $array("action" => $irc->say_something())

Смогу ли я назвать это с $array['action'] или мне придется сделать это как-нибудь по-другому?

Ответы [ 4 ]

2 голосов
/ 25 января 2011

Используйте call_user_func('func', list, of, args) или call_user_func_array('func', array(containing, arguments)).

Если вы хотите вызвать метод класса, вам нужно будет передать 'func' не aaстрока, но в виде массива: array($instance, 'func') - в вашем случае: array($irc, 'say_something')

Fyi, $array("action" => $irc->say_something()) не имеет смысла.Но вы, вероятно, хотели написать array("action" => $irc->say_something()).Однако это присваивает «действие» результату вызова метода, а не тому, что вы хотите.См. Последний абзац о том, как должно выглядеть значение 'action', чтобы использовать его в качестве указателя на метод.

1 голос
/ 25 января 2011

Конечно:

$invocation = array("action" => array(
                                      'func' => array($irc,'say_something'),
                                      'args' => array()));

call_user_func_array($invocation['action']['func'], $invocation['action']['args']);
0 голосов
/ 25 января 2011

Я знаю, что вы можете сделать что-то вроде этого:

$target = "  blah  ";
$function = "trim";
$trimmed = $function($target);

Я думаю, это также сработало бы, если $ function является элементом массива

0 голосов
/ 25 января 2011

call_user_func http://us.php.net/call_user_func

<?php
function barber($type)
{
    echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>
...