使用未知数量的参数调用动态函数

时间:2009-04-21 18:17:36

标签: php

不确定如何描述这个,但是这里......

我有一个大型的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 个答案:

答案 0 :(得分:2)

使用call_user_func_array function调用具有参数数组的函数。

如果您真的想从查询中提取参数,可以使用以下内容:

$params = array();
foreach ($_GET as $name => $val) {
    if (preg_match('/^param[1-9]\d*$/', $name)) {
        $param[$name] = $val;
    }
}
ksort($params);

答案 1 :(得分:0)

将您的参数收集到一个数组中,然后将其传递给您的函数。

答案 2 :(得分:0)

只需将$ _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,fwrites等......创建一个“批准的函数”列表并检查函数名称可能是个好主意在允许它被调用之前反对它。另外,我把parms作为字符串放在eval中的方式非常危险。你可以在传递的参数中获得字符串转义。可能更好的做一个for循环,并让变量名称而不是变量内容作为字符串。

最后,如果您确实知道函数的参数数量,那么使用

会更安全
$results = $mystuff['functionName']($mystuff[params][param1]); 

等等。