不确定如何描述这个,但是这里......
我有一个大型的PHP函数库,我希望通过某种api接口来公开。
例如,此查询字符串:
api.php?function=myFunction¶m1=xxx¶m2=xxx&
会转化为:
$ret = myFunction( $param1, $param2 );
..而这个查询字符串..
api.php?function=myFunction¶m2=xxx¶m1=xxx&
会转化为:
$ret = myFunction( $param1, $param2 );
请注意,我希望必须依赖查询字符串来放置查询中所需的参数,并按所需顺序。
这可行吗?我有一些可能工作的想法,但我想我会把它放在这里,也许从PHP专家那里得到一些更好的想法。
谢谢 -
答案 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]);
等等。