【问题标题】:Is there a way to figure out how many parameters a defined method expects from outside of the method? (PHP)有没有办法找出定义的方法期望从方法外部获得多少参数? (PHP)
【发布时间】:2011-07-24 17:20:39
【问题描述】:

我正在创建一个 MVC 框架,它通过操作的方法参数将“action”参数之后的任何 url 参数传递给请求的操作。

所以如果网址是:

host/controller_name/action_name/param1/param2

发生以下情况(当然是简化的):

$requested_controller = new controller_name();
call_user_func_array(array($requested_controller, action_name), array(param1, param2);

问题在于错误报告。如果使用错误数量的参数请求 url(动作需要两个参数,但 url 只包含一个参数,我会收到一条警告消息,然后是破坏)。

由于这是一个程序错误而不是异常,我不能以任何方式尝试/捕获它,可以吗?有没有办法在尝试运行之前检查操作方法的预期参数数量?或者我应该以完全不同的方式来攻击它?

编辑(解决方案)

                $action_method_relfection = new ReflectionMethod($requested_controller, $requested_action);
                if (count($path_variables) < $action_method_relfection->getNumberOfRequiredParameters() || count($path_variables) > $action_method_relfection->getNumberOfParameters()) {
                    // if not, redirect to 404 error
                    self::redirect_to_404();
                }

【问题讨论】:

标签: php methods parameters


【解决方案1】:

虽然您可以使用func_get_args() 函数,但感觉使用它的方式有点错误。

我总是会确定我正在调用什么函数以及它需要什么(可选...)参数。

【讨论】:

  • 这个函数只能在方法内部起作用,在警告已经发生之后。
  • 任何公共控制器方法都需要使用默认值的要求似乎很麻烦,然后需要检查每个方法以确保优雅地处理无效请求。 - 此外,没有定义参数也会导致任何阅读包含代码的人感到困惑。 - 我不想对每个控制器方法的内容提出繁琐的要求。
  • @dqhendricks 我同意,这就是为什么我说感觉有点不对劲:-)
【解决方案2】:

尝试一些简单的东西,比如

if (!isset($param1) || !isset($param2)) exit;

【讨论】:

  • 可能有数百个控制器类和数百个动作方法。我不能为每个人做这样的检查。
【解决方案3】:

我想,使用Reflection API,你可以找出每个方法接受多少个参数,使用某种组合


另一种解决方案是让您的方法只接受一个 - 并且总是一个 - 参数:一个数组,可以包含任意数量的项目。

这样,你总是传递一个参数,所有方法总是期望一个参数;并且不再有警告/错误。

【讨论】:

  • 这些想法很有趣。第二个让我感到紧张,因为所有参数都将通过数组的数字索引而不是命名参数传递。歧义会使包含的代码令人困惑。我将研究第一个想法的可能性。
  • @dqhendricks 您不仅限于数字索引,还可以使用字符串作为键。
  • @jeroen 我在哪里可以得到这些字符串?在网址中找不到它们。我不会在每个控制器方法中构建关键名称。
  • 解决了我的问题。谢谢。请参阅原始帖子编辑以获取最终解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多