PHP依赖注入和名称空间

时间:2018-11-24 16:20:49

标签: php dependency-injection namespaces

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

new App\Controllers\HomeController();

Class HomeController

use App\Views\HomeView;

class HomeController {

private $view;

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

或这种方式:

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

2 个答案:

答案 0 :(得分:0)

依赖项注入通常(如果不是总是)通过IoC(控制反转)容器进行。容器,或者更确切地说,它是依赖注入逻辑,负责创建对象,并通过某种魔术来获取期望添加的所有参数,并从容器依赖注入逻辑中创建它们。

您正在做的只是创建新对象。您可以按照自己希望的方式进行操作,但是就我个人而言,我可能会将视图传递给构造函数。

如果您想了解有关依赖项注入和容器的更多信息,请参见wiki条目。
如果愿意,您还可以使用php反射here来看看我对依赖容器的幼稚实现!

答案 1 :(得分:0)

您提供的示例反映了完全不同的方法(我给班级的命名方式与您相同)

// 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,并在此处进行搜索-主题已被广泛涵盖(What is dependency injection?What is Dependency Injection?When to use Dependency Injection