2016-02-02 5 views
0

В настоящее время я работаю над контейнером для инъекций зависимостей, и я наткнулся на множество разных типов (Pimple, Orno/di, Laravel's ...), и я планирую сделать что-то недалеко от Пимпла. Но у меня все еще есть вопрос: если я использую DI с помощью сеттеров и геттеров, правильно ли вводить «зависимости по умолчанию» в конструкторах зависимых классов? Позвольте мне дать вам Exemple:Зависимость PHP Setter от «зависимостей по умолчанию»

Так вот мой Exemple код:

<?php 

class Dependency 
{ 
    public function print($str) 
    { 
     echo $str; 
    } 
} 


class Dependent 
{ 
    private $_dependency; 

    public function __construct() 
    { 
     $this->_dependency = new Dependency; 
    } 


    public function setDependency(Dependency $dep) 
    { 
     $this->_dependency = $dep; 
     return $this; 
    } 

    public function depPrint($str) 
    { 
     $this->_dependency->print($str); 
     return $this; 
    } 
} 

Таким образом, пользовательский код может непосредственно использовать класс, не зная его зависимости:

$instance = new Dependent; 
$instance->depPrint('Hello world'); 

Или, если код пользователя нуждается в классе для использования другой зависимости, он может сделать именно так:

$instance = new Dependent; 
$instance->setDependency(new Dependency) 
    ->depPrint('Hello world'); 

Я чувствую себя e, это удобно, так как при тестировании вы можете заменить зависимости с помощью макетных классов и что код пользователя не должен знать ничего о зависимостях классов. Самый большой недостаток, который я обнаружил, заключается в том, что он по-прежнему создает связь с зависимостями по умолчанию, но это можно легко устранить, проверяя, существует ли класс или нет, а если он не существует, то не вводите ничего по умолчанию. Итак, есть ли недостатки в этой системе, следует ли использовать ее или использовать другое?

Заранее спасибо.

ответ

0

Вы могли бы объединить две вещи:

public function __construct($dep = null) 
{ 
    if (is_null($dep)) { 
     $this->_dependency = new Dependency; 
    } else { 
     $this->_dependency = $dep; 
    } 
} 
+0

Я видел некоторые люди говорят, что «аргументы конструктору не должен быть факультативным», я не знаю, если это правда, но в любом случае ваш вариант интересен, я буду видеть если я могу применить его к моему истинному коду. Спасибо! – TheKitsuneWithATie

Смежные вопросы