我有很多案件的开关。所有这些都使用相同的方案:案例 - >具有相同名称的函数并将结果放入var结果中。
switch ($_POST["field"]) {
case "keyword1": $result = keyword1(); break;
case "keyword2": $result = keyword2(); break;
case "keyword3": $result = keyword3(); break;
}
是否可以使用通用代码执行此操作,或者我是否必须手动执行此操作(如上所示)?
答案 0 :(得分:1)
如果名称与此完全相同,还有函数名称,您可以执行以下操作:
$result = $_POST["field"]();
要检查函数是否存在或是否可调用,您可以使用:is_callable()
和function_exists()
。
此外,用户无法调用您可以创建白名单的每个功能,其中包含用户可以呼叫的功能名称。
答案 1 :(得分:1)
您可以使用变量函数名称,但请确保在使用之前检查$ _POST值的格式,否则您将创建安全漏洞。
$functionName = $_POST['field'];
if(!preg_match("/^keyword\d+$/", $functionName) {
die('Invalid value for POSTDATA entry "field"');
}
$functionName();
答案 2 :(得分:1)
call_user_func()
会更好。
请在手册中查看:http://php.net/manual/en/function.call-user-func.php
但是你仍然必须过滤传入的值,否则你的代码将非常不安全......例如,您可以提供允许的函数数组,并检查该数组中是否有$_POST['field']
值。
答案 3 :(得分:0)
您可以将call_user_func
与功能名称的白名单一起使用:
$funcs = ['func1','funct2'...];
if(in_array($_POST['key'], $funcs)
$result = call_user_func($_POST['key']);
虽然我倾向于认为开关案例更具可读性