2014-11-15 2 views
0

Я пытаюсь поднять голову вокруг DI. Правильно ли я делаю это для классов, которые следуют схеме DI?Инъекция зависимостей PHP - инъекции магических методов?

class Boo 
{ 
    public $title = 'Mr'; 
    public $name = 'John'; 
    protected $deps; 

    public function __construct($deps) 
    { 
     $this->deps = $deps; 
    } 

    public function methodBoo() 
    { 
     return 'Boo method '.$this->deps; 
    } 
} 

class Foo 
{ 
    private $objects; 

    public function __construct() 
    { 
    } 

    // Set the inaccessible property magically. 
    public function __set($name, $value) 
    { 
     $this->$name = $value; 
    } 

    // Set the inaccessible $class magically. 
    public function __get($class) 
    { 
     if(isset($this->objects[$class])) 
     { 
      return $this->objects[$class]; 
     } 
     return $this->objects[$class] = new $class($this->deps); 
    } 

    public function methodFoo() 
    { 
     return $this->Boo->methodBoo(); 
    } 
} 

$Foo = new Foo(); 
$Foo->deps = 'says hello'; 
var_dump($Foo->methodFoo()); 

результат,

string 'Boo method says hello' (length=21) 

Я не хочу использовать строительство инъекции в некоторых случаях, потому что не все методы в Foo полагаются на те же инъекции. Например, methodFoo() в Foo полагается только на Boo, тогда как другие методы полагаются на другие классы/инъекции.

Кроме того, я не хочу использовать инъекции сеттера либо потому, что я мог бы написать много их в Foo, как

setBoo() {} 
setToo() {} 
setLoo() {} 
... and so on... 

Так я думал, используя магический метод __get и __set может спасти я от окончания написания длинный список из них. При этом я только «вводят» зависимости, когда это необходимо по методу в Foo.

Правильно ли это делается? Раньше я еще не проводил никаких испытаний с помощью модульного теста. Можно ли проверить это решение?

Или любые лучшие решения, которые у вас есть?

ответ

1

Не используйте магические методы, если это возможно ...

Не использовать магические методы, если это возможно, как это может сделать это очень трудно для себя или кого-то еще, чтобы вернуться позже и понять, где и как некоторые объекты были введены (даже при использовании хорошей среды IDE). Эти методы магии __set и __get не являются долгосрочным решением вашей проблемы и только добавят путаницу в долгосрочной перспективе.

Как вы уже знаете, вы можете использовать инъекцию «конструктор» для установки свойств и объектов инъекции, которые «обязательно» во время создания объекта.

В качестве альтернативы, если у вас есть зависимости, которые 'optional', то используйте методы setter/getter. Таким образом, вы «знаете», какие объекты использует ваш класс для выполнения его функций.

Если вашему классу требуется 5 или более зависимостей (обязательно или по желанию), то, возможно, ваш класс пытается многое сделать. Разделите его на более мелкие классы, для которых требуется меньше зависимостей, и вы обнаружите, что ваш код не только становится более читаемым/понятным, но и более модульным и многоразовым. (Разделение проблем и т. Д.)

Что касается тестирования класса, использующего магические методы, я уверен, что это можно сделать, но при гораздо большем, чем если бы не использовать магические методы.

Google «Дизайн шаблонов». То, что вы находите и узнаете о шаблонах проектирования, улучшит то, как вы «присоединяетесь» или «проводя» свои классы вместе.

+0

Спасибо за ответ. Это то, о чем я думал! – laukok

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