我正在尝试构建一个基于 mvc 的小型应用程序。
如何根据查询字符串调用类中的方法?
例如,$_GET 查询字符串被设置为 load_master_form
http://www.domain.com/settings/load_master_form
并在设置类中调用该方法,我正在做:
function __construct(){
$this->{$_GET['method']}();
}
但显然这不起作用——不可能加载这样的方法。那么它会怎么做呢?
我正在尝试构建一个基于 mvc 的小型应用程序。
如何根据查询字符串调用类中的方法?
例如,$_GET 查询字符串被设置为 load_master_form
http://www.domain.com/settings/load_master_form
并在设置类中调用该方法,我正在做:
function __construct(){
$this->{$_GET['method']}();
}
但显然这不起作用——不可能加载这样的方法。那么它会怎么做呢?
我认为这可以正常工作,只要您为 $_GET['method'] 创建了方法,并且您使用的是 URI 路由(.htaccess 或其他)
通常我倾向于在 URI 中调用方法名称 -
// domain.com/class_name/method_name/params
class class_name{
function __construct(){
...
}
function method_name(){
...
}
// etc.
}
首先,您必须创建 .htaccess 文件,将所有请求重定向到单个文件(通常是 index.php)。然后将用户输入的字符串作为GET变量传递给 php。
此处介绍了如何创建 .htaccess 文件。
然后你必须决定 MVC 的结构。假设您希望 url(http://www.someting.com/first/second/third) 中的每个第三个参数都是一个方法。然后你会做这样的事情..
// Variables
$args = explode('/',$_GET['method']);
// Get method
$method = rtrim($args[1]);
这只是一个肮脏的解决方案..
我会使用反射,如下所示:
public static function doUserMethod($methodName)
{
$reflectionMethod = new ReflectionMethod('YourUserMethodsClass', $methodName);
return $reflectionMethod->invokeArgs(new YourUserMethodsClass(), array(/* Method Arguments Here */));
}
然后可以称为:
YourClass::doUserMethod($_GET['method']);
这样做的好处是您可以将用户限制为仅使用您指定的特定类中的方法(即YourUserMethodsClass
在我的示例中)。显然,如果您的方法需要参数(与您给出的示例不同),您将需要一些特殊的额外处理。