Динамическое использование прототипов функций в PHP

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
3 376
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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 (), ваши аргументы не оцениваются до времени выполнения. Довольно мило.

Другие вопросы по теме