【问题标题】:Check if class has method in PHP检查类是否在 PHP 中有方法
【发布时间】:2012-05-04 11:48:52
【问题描述】:

目前我的代码如下所示:

switch ($_POST['operation']) {
    case 'create':
        $db_manager->create();
        break;
    case 'retrieve':
        $db_manager->retrieve();
        break;
...
}

我想要做的是,检查名为$_POST['operation'] 的方法是否存在:如果是则调用它,否则回显“错误”是否可能?我该怎么做?

【问题讨论】:

    标签: php oop class methods


    【解决方案1】:

    你可以使用method_exists:

    if (method_exists($db_manager, $_POST['operation'])){
      $db_manager->{$_POST['operation']}();
    } else {
      echo 'error';
    }
    

    虽然我强烈建议你不要这样编程......

    【讨论】:

    • @epic_syntax:因为我可以使用 wget/cURL 欺骗 POST 变量并四处寻找您不一定希望公开的方法。此外,您从不直接信任用户输入,您总是希望对其进行清理。基本上,如果您在其他任何地方使用$_POST[...],但文件顶部嵌入在安全性检查中,那么您做错了并自找麻烦。
    • 我差不多,你会推荐not to use PHP at all :)
    • @epic_syntax: 最简单的方法是设置允许运行的方法的白名单
    • @iblue:你只是想分享那个链接并且可以找到更好的地方,不是吗?
    • PHP 编程 11 年多,我会抓住一切机会 bash。 :)
    【解决方案2】:

    您可以使用is_callable()method_exists()

    它们之间的区别在于,如果 __call() 处理方法调用,则后者不适用于这种情况。

    【讨论】:

      【解决方案3】:

      使用method_exists()

      method_exists($obj, $method_name);
      

      【讨论】:

        【解决方案4】:

        您可以使用method_exists()但这是一个非常糟糕的主意

        如果将$_POST['operation'] 设置为一些神奇的函数名称(如__set()),您的代码仍然会爆炸。最好使用允许的函数名数组。

        【讨论】:

        • 我想,你的意思是这样的。 $操作=数组(“检索”,“创建”); if (isset($_POST['operation']) && in_array($_POST['operation'], $operations)) { $db_manager->{$_POST['operation']}();我可以将collect所有可用的方法自动或仅手动放入数组中吗?
        • 让用户在对象中调用任意方法通常是个坏主意(而且速度慢得要命)。制作您自己的列表,或者更好地使用您问题中的 switch 语句。
        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多