Я пишу конструкцию на PHP, в которой парсер определяет, какую функцию вызывать динамически, примерно так:
// The definition of what to call
$function_call_spec = array( "prototype" => "myFunction",
"parameters" => array( "first_par" => "Hello",
"second_par" => "World"));
// Dispatch
$funcPrototype = $function_call_spec["prototype"];
$funcPrototype(); // Here we call function 'myFunction'.
Это все нормально и модно. Но теперь наступает следующий шаг, передача параметров, которые я действительно не знаю, возможно ли это так, как я хочу это сделать. Однако меня никогда не перестает удивлять, на что способны языки сценариев в наши дни, так что вот:
Можно передать параметры функции следующим образом:
// Here we call function 'myFunction' with the array of parameters.
$funcPrototype( $function_call_spec["parameters"] );
Однако я хочу правильно объявить myFunction с четкими аргументами и т. д.:
function myFunction( $first_par, $second_par )
{
}
Тогда возникает вопрос: есть ли способ передать параметры функции динамически, просто перебирая массив параметров?
Чтобы уточнить, я не хочу сделать это так:
$funcPrototype( $function_call_spec["parameters"]["first_par"],
$function_call_spec["parameters"]["second_par"] );
Поскольку для этого требуется, чтобы мой код статически знал подробности о myFunction, что противоречит всей идее.
Вместо этого я бы хотел сделать это примерно так:
// Special magic PHP function which can be used for invoking functions dynamically
InvokeFunction( $funcPrototype, $function_call_spec["parameters"] );
В результате вызывается myFunction, и все параметры в массиве передаются каждой отдельной переменной параметра в прототипе.
Любые комментарии приветствуются.
С уважением.
/Р
PS: Ни один код в этом посте не был протестирован на опечатки и т. д.






call_user_func_array($funcPrototype, $function_call_spec["parameters"]);
Возможно, вы захотите создать оболочку, которая назовет функцию в соответствии с вашими предпочтениями, например:
function InvokeFunction($function, $args = array()) {
return call_user_func_array($function, (array)$args);
}
С помощью этой функции вы можете вызвать ее 3 разными способами:
$return = InvokeFunction('doStuff');
$return = InvokeFunction('doStuff', $single_arg);
$return = InvokeFunction('doStuff', $multiple_args);
Вы должны использовать call_user_func_array, который может вызывать любую функцию или метод и берет параметры из массива.
В качестве альтернативы вы можете использовать ReflectionFunction::invokeArgs, но нет преимущества перед call_user_func_array, если вы уже не используете этот класс для чего-то еще (например, для проверки того, принимает ли функция, которую вы вызываете, соответствующее количество и типы аргументов).
call_user_func_array() - лучший выбор, если вам не нужно обеспечивать выполнение контракта, в противном случае используйте ReflectionFunction.
http://us2.php.net/create_function
Когда вы используете create_function (), ваши аргументы не оцениваются до времени выполнения. Довольно мило.