PHP - 类中的静态方法或只是一个函数

时间:2011-08-03 23:01:46

标签: php model-view-controller controller

我对控制器的使用存在一些困境。就像usualy一样,路由器(调度程序或前端控制器)在控制器类中调用一些静态方法,例如PageController :: showIndexPage()。我的控制器通常有几行代码,通常是模型加载,获取数据并将其传递给视图。

我的问题是 - 因为每个http请求只执行一个方法,我应该避免类,只为控制器创建一个函数吗?有时,我确实每个控制器有几种方法,但每次只使用一种方法。我知道这不是什么大问题,但也许我可以得到更好的系统?下面是一个例子:我的AuthController有像showLoginPage(),doLogin(),doLogout()这样的方法......所以,也许最好避免使用类,并把这个控制器作为几个函数写入分离的文件,eq auth / show_login_page。 php,auth / do_login.php等等?这个概念是否有一些优点/缺点?

更新:因为有些用户膨胀我对静态方法的使用,我必须防御:)我不创建控制器的实例,因为没有必要。在99%的情况下,控制器仅用于将数据从模型传递到视图。并且,不需要仅为一个方法调用创建实例。这就是为什么方法是静态的原因。以下是我的一个控制器的示例:

class ArticlesController {

    static function showArticle($article_id) {
        $article = ArticlesModel::getArticleById($article_id);
        View::getInstance()->assignByRef("article", $article);
        View::getInstance()->display("articles/one.tpl");
    }
    static function showAllArticles() {
        $articles = ArticlesModel::getAllArticles();
        View::getInstance()->assignByRef("articles", $articles);
        View::getInstance()->display("articles/all.tpl");
    }
}

3 个答案:

答案 0 :(得分:2)

静态类函数就像全局函数一样,所以不知道具体为什么要为控制器使用静态类函数(这非常不方便),所以要么将它们改为标准对象方法,要么完全改为全局函数。 p>

我建议您将整个应用程序分支到一个分支中,该分支用全局函数替换所有控制器,而另一个分支用非静态类函数替换。然后你可以更好地比较这两个概念。

如果您不想玩游戏并且要求指针,请将所有静态类函数转换为非静态函数,然后继续直到遇到下一个问题。

答案 1 :(得分:2)

不太明白已经投票并标记为正确答案的第一个答案。以下是我的看法:

静态方法类似于全局方法,但更加有条理并包含在命名空间和类中。这并不意味着它们仅仅因为这个定义而比对象更好。他们有他们的用法。如果您正在使用一个将保持特定状态的类而不是更适合作为非静态类的类,那么您应该实例化并使用它。如果它不会在所述过程中维持一个特定的状态,即它只是接收参数对它做了一些事情并返回它更适合静态的响应。

这是我对静态与非静态的简单看法。在您的情况下,您可能需要其他事情来实现控制器的顺利运行。一个通常有问题的事情是静态类没有构造函数,因为它们没有实例化。这是我认为如果父节点具有构造函数并且接收为在控制器中使用而设置的对象,则可以实例化控制器的唯一理由。我认为如果它们很简单,你就可以使用静态控制器了。

关于你有功能或上课的问题。一个类将您的逻辑封装在一个单元中。这只是一种静态方式,该组中的任何内容都严格属于此单元。我们来自一个过去常常具有普通功能的世界,但通常会很快变形。看一下软件熵,他们就不会停止发生这种情况。由于类是对它们所包含内容的引用,因此人们以这种方式使用它。你可以在一个文件的顶部有10个需求的图像,然后你突然需要一个函数,一个开发人员可能不会想太多,只是将它添加到最接近的匹配文件之一并说啊它全部包括在内所以它将工作。对于课程,你有点想到把它放在哪里,如果你把它放在错误的地方,开发者可能会错过它,因为它们不是全球可用的。

希望这有帮助。

答案 2 :(得分:0)

我会说,把所有的东西放在一起。所以使用一个班级。此外,使用类会自动提供某种命名空间。只是因为如果在几个包含文件中有一个名为doSomething()的方法,则不能包含多个这些文件。但是,如果将该方法放入“静态类”中,则仍然可以包含它们。从PHP 5.3开始,您也可以使用“真实”命名空间,但类方法仍然更好。

或者想象你需要一个常数。如果它是一个类,则常量在类范围内。如果使用函数,则必须污染全局命名空间,并且一次只能存在一个具有此类名称的常量。