Внедрение зависимостей Php и пространства имен - PullRequest
0 голосов
/ 24 ноября 2018

Каков наилучший способ внедрения внедрения зависимостей:

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());

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Примеры, которые вы предоставили, отражают совершенно разные подходы (я оставил имена классов такими же, как у вас):

// 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;
    }
}

Это на самом деле внедрение зависимости: все, что нужно вашему классу, создается вне класса и передаетсяк нему через конструктор (в данном конкретном случае).

Некоторый инструмент (контейнер внедрения зависимостей) может или не может использоваться для управления зависимостями в зависимости от вашего случая.

Чтобы получить более подробную информациюпожалуйста, смотрите статью https://martinfowler.com/articles/injection.html Мартина Фаулера и ищите здесь по SO - тема широко освещена ( Что такое внедрение зависимостей? , Что такое внедрение зависимостей? , Когда использовать инъекцию зависимостей ).

0 голосов
/ 24 ноября 2018

Инъекция зависимости обычно (если не всегда) осуществляется через IoC (инверсия контроля) - контейнер.Контейнер, или, вернее, его логика внедрения зависимостей, заботится о создании объектов и посредством некоторой магии извлекает все параметры, ожидаемые для добавления, и создает их, в том числе из логики внедрения зависимостей контейнеров.

То, что вы делаете, этоскорее просто создание новых объектов.Вы можете сделать это любым способом, но лично я, вероятно, пропущу представление через конструктор.

Если вы хотите узнать больше о внедрении зависимостей и контейнерах, id обратитесь к wiki запись об этом.
Вы также можете взглянуть на одну из моих наивных реализаций контейнера зависимостей, используя php размышления здесь , если хотите!

...