Autor wpisu: Łukasz Socha, dodany: 15.07.2012 13:25, tagi: php
pobierz w .pdf(przeznaczone do wydruku)
Dependency Injection jest chyba jednym z najprostszych wzorców projektowych, więc zapewne wiele osób używało go nieświadomie. Warto jednak wiedzieć, że dane rozwiązanie ma szerokie zastosowanie i jakąś nazwę…
Tym razem wyjątkowo nie będzie opisu teoretycznego, bo i nie za bardzo jest o czym mówić. Zasadę najłatwiej będzie zrozumieć na praktycznym przykładzie.
Przykład z życia wzięty
Przeanalizujmy fragment klasy do obsługi użytkownika.
<?php class Session { public function __construct($name = 'PHP_SESSSION') { session_name($name); session_start(); } public function set($key, $value) { $_SESSION[$key] = $value; } public function get($key) { return $_SESSION[$key]; } } class User { protected $session; public function __construct($session) { $this->session = $session; } public function setName($name) { $this->session->set('name', $name); } public function getName() { return $this->session->get('name'); } } $session = new Session("MOJA_SESJA"); $user = new User($session); $user->setName("moj_login"); echo $user->getName(); ?>
Klasa Session udostępnia obiektowe API do obsługi sesji. Obiekt tej klasy jest przekazywany w konstruktorze obiektu klasy User, gdzie jest dalej wykorzystywany. Jest to właśnie wstrzykiwanie zależności, czyli nie tworzymy instancji obiektu w danej klasie, tylko przekazujemy go przez konstruktor/metodę.
Dlaczego takie rozwiązanie jest lepsze niż:
$this->session = new Sessioon($parametrKonstuktora);
Parametr ten na dobrą sprawę nie dotyczy obiektu klasy User – jest „sztucznie” dodany. Zdecydowanie przejrzyściej i wygodniej jest zdefiniować obiekt poza klasą i przekazać już gotowy, w pełni skonfigurowany przez nasze parametry. Poza tym przy zmianach parametrów konstruktora musielibyśmy za każdym razem modyfikować wszystkie klasy inicjujące obiekt danej klasy.
Zastosowanie
Wszędzie tam, gdzie występują zależności między obiektami.