Вызов динамической функции с неизвестным количеством параметров - PullRequest
0 голосов
/ 21 апреля 2009

Не уверен, как именно это описать, но здесь идет ..

У меня есть большая библиотека функций PHP, которую я хочу представить через какой-то интерфейс API.

Например, эта строка запроса:

api.php?function=myFunction&param1=xxx&param2=xxx&

будет переводить на это:

$ret = myFunction( $param1, $param2 );

.. тогда как эта строка запроса ..

api.php?function=myFunction&param2=xxx&param1=xxx&

будет переводить на это:

$ret = myFunction( $param1, $param2 );

Обратите внимание, что я ожидаю, что придется полагаться на строку запроса, чтобы разместить параметры, требуемые в запросе, и в требуемом порядке.

Это выполнимо? У меня есть несколько идей о том, что может работать, но я решил изложить это здесь и, возможно, получить некоторые лучшие идеи от гуру PHP.

Спасибо -

Ответы [ 3 ]

2 голосов
/ 21 апреля 2009

Используйте функцию call_user_func_array для вызова функции с массивом ее параметров.

И если вы действительно хотите извлечь параметры из запроса, вы можете использовать что-то вроде этого:

$params = array();
foreach ($_GET as $name => $val) {
    if (preg_match('/^param[1-9]\d*$/', $name)) {
        $param[$name] = $val;
    }
}
ksort($params);
0 голосов
/ 21 апреля 2009

Просто передайте $ _GET своей функции. внутри вашей функции вы можете искать нужный вам параметр. Или создайте вторую функцию

function getFunctionCall($getParams)
{
    $function = $getParams['function'];
    returnArray['functionName'] = $function;

    $getArraySize = count($getParams);
    for(i = 1; $i < $getArraySize; $i++)
    {
        $param = $getParams['param'. $i];
        // do any cleaning you need on $param i ;
        $param = urldecode($param);
        returnArray['params']['param'.$i] = $param;
    }
    return $returnArray;

}

Теперь у вас есть возвращаемый массив, и вы можете сделать что-то вроде этого:

$mystuff = getFunctionCall($_GET);

$functionString = $mystuff['functionName'] . '("' . implode($mystuff[params], '","') . '")"; 

$myResult = eval($functionString);

Тем не менее, будьте очень осторожны при выполнении этих вещей ... functionName может быть любой старой вещью под солнцем, включая fopen's, fwrites и т. Д. ... Возможно, было бы неплохо создать список «утвержденных функций» и проверить имя функции против этого, прежде чем позволить его вызвать. Кроме того, способ, которым я помещаю пармы туда как строки в eval, довольно опасен. Вы можете получить строку, выходящую в переданных параметрах. Вероятно, лучше сделать цикл for и получить в нем имена переменных вместо содержимого переменных в виде строк.

Наконец, если вы на самом деле знаете количество аргументов вашей функции, будет гораздо безопаснее просто использовать

$results = $mystuff['functionName']($mystuff[params][param1]); 

и т. Д.

0 голосов
/ 21 апреля 2009

собирает ваши параметры в массив и передает их вашей функции.

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