Php 基于URL的加载方法

Php 基于URL的加载方法,php,model-view-controller,class,methods,Php,Model View Controller,Class,Methods,我正在尝试构建一个基于mvc的小型应用程序 如何基于查询字符串在类中调用方法 例如,$\u GET查询字符串被设置为load\u master\u表单 http://www.domain.com/settings/load_master_form 要在settings类中调用该方法,我执行以下操作: function __construct(){ $this->{$_GET['method']}(); } 但很明显,这是行不通的——这样加载一个方法是不可能的。那么该怎么做呢?首

我正在尝试构建一个基于mvc的小型应用程序

如何基于查询字符串在类中调用方法

例如,$\u GET查询字符串被设置为load\u master\u表单

http://www.domain.com/settings/load_master_form
要在settings类中调用该方法,我执行以下操作:

function __construct(){
    $this->{$_GET['method']}();
}

但很明显,这是行不通的——这样加载一个方法是不可能的。那么该怎么做呢?

首先,您必须创建and.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]);

这只是一个diry解决方案。

我认为这会很好,只要您已经为$\u GET['method']创建了方法,并且您正在使用URI路由(.htaccess或其他什么)

通常我倾向于在URI中调用方法名-

// domain.com/class_name/method_name/params

class class_name{
    function __construct(){
        ...
    }
    function method_name(){
        ...
    }
// etc.
}

我会使用反射,就像这样:

public static function doUserMethod($methodName)
{
    $reflectionMethod = new ReflectionMethod('YourUserMethodsClass', $methodName);
    return $reflectionMethod->invokeArgs(new YourUserMethodsClass(), array(/* Method Arguments Here */));
}
可称之为:

YourClass::doUserMethod($_GET['method']);

这样做的好处是,您可以将用户限制为仅使用您指定的特定类中的方法(例如,在我的示例中,
YourUserMethodsClass
)。显然,如果您的方法需要参数(与您给出的示例不同),则需要一些特殊的额外处理。

您需要创建路由机制。。我想可能会有帮助你确定你会想做那样的事吗?如何阻止恶意用户执行
example.com?method=blow\u up\u the\u universe
?@Marc B,该类仅加载公共数据,如果该方法不存在,则会转到404页。您知道Htaccess重写规则吗?。还有一个问题,设置是否为文件夹。即使在最简单的情况下,也会假设
$\u GET['method
]中至少有两个斜杠。如果您不知道字符串中分隔符的数量,那么在末尾添加一些额外的分隔符是一个很好的技巧:
explode('/',$u GET['method']./')至少这样可以避免不必要的警告。。如果不能真正解决底层问题,mvc框架中通常会有http://who.cares/
。。此链接将产生1或0个斜杠(取决于URL重写详细信息),这反过来可能会在您访问第二个数组元素时引发警告。实际上,我在代码中犯了一个错误,您将使用数组[1]而不是数组[2]。您可以检查数组[0]是否存在,如果为true,则调用一个类,如果数组[1],则调用该类中的方法,依此类推。正如我所说,mvc url的所有模式都是www.something.com/class/method/parametersyes。。我相应地更新了注释。反射比简单的
方法\u exists()
慢几个数量级,静态调用意味着您决定求助于过程编程。这就是我现在正在尝试的,但我的问题是如何从方法名称uri加载该方法?为什么您将其标记为接受答案?因为它帮助我找到了答案。。。