以一般方式切换案例

时间:2015-03-09 21:36:15

标签: php

我有很多案件的开关。所有这些都使用相同的方案:案例 - >具有相同名称的函数并将结果放入var结果中。

switch ($_POST["field"]) {
    case "keyword1": $result = keyword1(); break;
    case "keyword2": $result = keyword2(); break;
    case "keyword3": $result = keyword3(); break;
}

是否可以使用通用代码执行此操作,或者我是否必须手动执行此操作(如上所示)?

4 个答案:

答案 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']);

虽然我倾向于认为开关案例更具可读性