【问题标题】:Php Dependency Injection and namespacesPHP 依赖注入和命名空间
【发布时间】:2019-04-26 20:33:21
【问题描述】:

什么是实现依赖注入的最佳方式,这种方式:

new App\Controllers\HomeController();

类 HomeController

use App\Views\HomeView;

class HomeController {

private $view;

public function __construct() {
    $this->view = new HomeView();

或者这样:

new App\Controllers\HomeController(new App\Views\HomeView());

【问题讨论】:

    标签: php dependency-injection namespaces


    【解决方案1】:

    依赖注入通常(如果不总是)通过IoC(控制反转)- 容器完成。容器,或者更确切地说它的依赖注入逻辑负责创建对象,并通过一些魔法获取所有预期添加的参数并创建它们,同样来自容器依赖注入逻辑。

    您所做的只是创建新对象。您可以按照自己的意愿进行操作,但就个人而言,我可能会通过构造函数传递视图。

    如果您想了解更多关于依赖注入和容器的信息,请参考wiki 条目。
    如果您愿意,您还可以查看我使用 php 反射 here 的依赖容器的天真实现之一!

    【讨论】:

      【解决方案2】:

      您提供的示例反映了完全不同的方法(我的类命名与您的相同):

      // App/Controllers/HomeController.php
      use App\Views\HomeView;
      
      class HomeController {
      
          private $view;
      
          public function __construct() {
              $this->view = new HomeView();
          }
      }
      

      这不是依赖注入,你创建你的类所依赖的东西类中。

      比较:

      // App/Controllers/HomeController.php
      use App\Views\HomeView;
      
      class HomeController {
      
          private $view;
      
          public function __construct(HomeView $view) {
              $this->view = $view;
          }
      }
      

      这实际上是依赖注入:无论您的类需要什么,都在类的外部创建并通过构造函数传递给它(在这种特殊情况下)。

      某些工具(依赖注入容器)可能会或可能不会用于管理依赖项,具体取决于您的情况。

      要了解更多详细信息,请参阅 Martin Fowler 的文章 https://martinfowler.com/articles/injection.html 并在此处搜索 SO - 该主题已广泛涵盖(What is dependency injection?What is Dependency Injection?When to use Dependency Injection)。

      【讨论】:

        猜你喜欢
        • 2016-04-28
        • 2023-03-25
        • 1970-01-01
        • 2016-06-11
        • 2017-06-01
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多