Динамическое использование прототипов функций в PHP - PullRequest
3 голосов
/ 11 октября 2008

Я пишу конструкцию в 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: Ни один из кодов в этом посте не был проверен на опечатки и т. Д.

Ответы [ 4 ]

11 голосов
/ 11 октября 2008

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

В качестве альтернативы вы можете использовать ReflectionFunction::invokeArgs, но это не дает никаких преимуществ по сравнению с call_user_func_array, если вы уже не используете этот класс для чего-то другого (например, для проверки, принимает ли вызываемая вами функция соответствующее число и типы аргументов).

5 голосов
/ 11 октября 2008
call_user_func_array($funcPrototype, $function_call_spec["parameters"]);

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

function InvokeFunction($function, $args = array()) {
    return call_user_func_array($function, (array)$args);
}

С помощью этой функции вы можете вызывать ее тремя различными способами:

$return = InvokeFunction('doStuff');
$return = InvokeFunction('doStuff', $single_arg);
$return = InvokeFunction('doStuff', $multiple_args);
0 голосов
/ 29 января 2009

http://us2.php.net/create_function

Когда вы используете create_function (), ваши аргументы не оцениваются до времени выполнения. Довольно мило.

0 голосов
/ 11 октября 2008

call_user_func_array() - лучший выбор, если вам не нужно исполнять договор, в противном случае используйте ReflectionFunction.

...