【问题标题】:Extend Core PHP Class instead of Dependency Injection?扩展核心 PHP 类而不是依赖注入?
【发布时间】:2011-06-23 02:47:39
【问题描述】:

我正在开发一个应用程序,它有一个“库”文件夹,其中包含一个自制框架/库(会话、数据库、缓存、配置类型类),然后是一个“模块”文件夹,其中包含各个部分的文件夹我的应用程序(即;博客/、论坛/、帐户/等)

在我的大多数模块(博客、论坛等)中,我需要多个对象,例如缓存、数据库、记录器、配置对象。我打算为此使用依赖注入,但我很好奇,难道我不能只有一个核心类/对象可以做我的数据库、缓存、记录器、时间、方法之类的东西,然后把这个核心类扩展到我的另一个模块类并可以访问所有这些东西而无需注入它们?

我对使用类/对象还很陌生,所以我可能会离开这里,请解释一下。

【问题讨论】:

    标签: php oop class object


    【解决方案1】:

    类应该有一个single responsibility。执行缓存、数据库访问、日志记录和时间等的核心类实际上是 God Object aka The Blob。这是一个AntiPattern。不要那样做。让他们SOLID

    【讨论】:

      【解决方案2】:

      如果您专门化类,或者扩展它们,扩展类是有意义的。
      如果扩展与基类的原始目的无关,这没有意义,而且通常会变得混乱。

      例如,您可以使用DbMySql 类(专业化)扩展DbBase 类,或者使用Html5Helper(扩展名)扩展HtmlHelper

      您不应将DbClass 扩展为ProductsModule。两者彼此无关。 ProductsModule 本身并没有绑定到数据库,因此您正在混合彼此无关的职责。

      【讨论】:

        【解决方案3】:

        可以做的是创建一个工厂类来实例化并提供你需要的单个对象。有点像:

        $db = myFactory::getDBO();
        $conf = myFactory::getConfig();
        $session = myFactory::getSession();
        

        等等。

        【讨论】:

        【解决方案4】:

        我也同意戈登的观点。

        我个人避免使用工厂静态方法方法。本质上,它相当于使用一个全局变量。这是服务定位器反模式。

        除了建议的 DI 容器之外,我发现手动依赖注入(即使用 DI 容器)是一种有价值的方法。没有工具(即容器)可以将您的类设计为松散耦合,我发现使用手动 DI 有助于专注于这一点。

        [附注我会将此添加为评论,但我是新手,无法发表评论]

        【讨论】:

          猜你喜欢
          • 2014-06-05
          • 2016-06-22
          • 2018-12-14
          • 1970-01-01
          • 2018-01-03
          • 2019-11-18
          • 2019-02-16
          • 1970-01-01
          • 2017-12-09
          相关资源
          最近更新 更多