首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用未知参数数的动态函数

问调用未知参数数的动态函数
EN

Stack Overflow用户
提问于 2009-04-21 18:17:36
回答 3查看 495关注 0票数 0

不太清楚该怎么描述,但是这里..。

我有一个大型的PHP函数库,我想通过某种api接口公开它。

例如,这个查询字符串:

代码语言:javascript
复制
api.php?function=myFunction&param1=xxx&param2=xxx&

将转化为:

代码语言:javascript
复制
$ret = myFunction( $param1, $param2 );

。。而这个查询字符串。

代码语言:javascript
复制
api.php?function=myFunction&param2=xxx&param1=xxx&

将转化为:

代码语言:javascript
复制
$ret = myFunction( $param1, $param2 );

请注意,我希望必须依赖查询字符串将所需的参数放在查询中,并按所需的顺序排列。

这可行吗?我有一些可能有用的想法,但我认为我应该把它放在这里,也许可以从PHP专家那里得到一些更好的想法。

谢谢-

EN

回答 3

Stack Overflow用户

发布于 2009-04-21 18:19:58

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

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

代码语言:javascript
复制
$params = array();
foreach ($_GET as $name => $val) {
    if (preg_match('/^param[1-9]\d*$/', $name)) {
        $param[$name] = $val;
    }
}
ksort($params);
票数 2
EN

Stack Overflow用户

发布于 2009-04-21 18:19:38

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

票数 0
EN

Stack Overflow用户

发布于 2009-04-21 19:03:34

只需将$_GET传递给您的函数即可。在您的函数中,您可以查找您想要的参数。或者创建第二个函数

代码语言:javascript
复制
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;

}

现在您有了一个返回数组,您可以这样做:

代码语言:javascript
复制
$mystuff = getFunctionCall($_GET);

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

$myResult = eval($functionString);

不过,做这件事要小心.functionName可能是阳光下的任何旧东西,包括fopen,fopen等等.在允许调用函数之前,创建一个“已批准的函数”列表并对照它检查函数名可能是个好主意。另外,我把parms作为字符串放在那个eval中的方式是非常危险的。你可以让字符串在传递的对角线中转义。也许最好做一个for循环,让它将变量名而不是变量内容作为字符串来执行。

最后,如果您确实知道函数的参数数,那么只使用它就更安全了。

代码语言:javascript
复制
$results = $mystuff['functionName']($mystuff[params][param1]); 

诸若此类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/773897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档