【问题标题】:PHP - static method in class or just a functionPHP - 类中的静态方法或只是一个函数
【发布时间】:2011-10-19 13:04:46
【问题描述】:

我对控制器的使用有些困惑。像往常一样,路由器(调度程序或前端控制器)调用控制器类中的一些静态方法,eq 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");
    }
}

【问题讨论】:

    标签: php model-view-controller controller


    【解决方案1】:

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

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

    【讨论】:

    • 您可以将全局函数中的事物放在一起,赋予它们相同的前缀。就像你建议的那样,它是相同的“有点”命名空间。只是指出这一点,因为静态类函数非常有限,你应该明智地使用它们,而不是一般的 MVC 模式恕我直言。
    • 我觉得静态类函数更方便,因为它除了帮助将全局函数分离到逻辑位置之外,它还允许自动加载函数和全局变量,而不是为所有函数使用一个巨大的文件或者需要手动加载每个函数文件。
    【解决方案2】:

    静态类函数与全局函数非常相似,因此不知道为什么要为控制器使用静态类函数(这很尴尬),因此要么将它们更改为标准对象方法,要么完全更改为全局函数。

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

    如果你不想玩弄,你需要指针,将所有静态类函数转换为非静态函数,然后继续,直到遇到下一个问题。

    【讨论】:

      【解决方案3】:

      不太理解已被投票并标记为正确答案的第一个答案。这是我的看法:

      静态方法类似于全局方法,但更有组织并包含在命名空间和类中。这并不意味着仅仅因为这个定义它们就比对象更好。他们有他们的用法。如果您正在使用一个将保持特定状态的类,而不是更适合成为非静态类,即您应该实例化并使用它。如果它不打算在所述过程中保持特定状态,即它只是接收参数并对其进行处理并返回响应,则它更适合静态。

      这是我对静态与非静态的简单看法。在您的情况下,您可能需要发生其他事情才能使控制器顺利工作。一个常见的问题是静态类没有构造函数,因为它们没有实例化。这是我认为如果父级具有构造函数并接收设置为跨控制器使用的对象,则可以实例化您的控制器的唯一充分理由。如果静态控制器这么简单,我认为您已经掌握了它们。

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 2012-09-04
        • 2016-06-26
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多