Wstrzykiwanie zależności (ang. Dependency Injection) to wzorzec projektowy, który pozwala tworzyć luźne powiązania między klasami. Dzięki temu program staje się bardziej rozszerzalny, elastyczny i można go łatwo testować. Preferowanym sposobem jest wstrzykiwanie zależności poprzez konstruktor.
PRZYKŁAD
W przykładzie napiszemy prosty programik do detekcji języka przeglądarki internetowej z przekierowaniem na odpowiednią wersję strony np: https://example.com/pl
Klasa Browser zawiera funkcję getLang() do pobierania języka przeglądarki ze zmiennej globalnej – $_SERVER[’HTTP_ACCEPT_LANGUAGE’]:
1 2 3 4 5 6 7 8 9 |
<?php // Browser.php class Browser { public function getLang() { return substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } } |
Zmienna $_SERVER[’HTTP_ACCEPT_LANGUAGE’] zwróci np: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7, a funkcja substr obetnie cały ciąg tekstowy do dwóch znaków, czyli: pl.
Klasa Web, to klasa, do której poprzez konstruktor wstrzykiwana jest instancja obiektu Browser.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // Web.php class Web { private $browser; public function __construct(Browser $browser) { $this->browser = $browser; } public function redirect() { header('Location: https://example.com/'.$this->browser->getLang()); exit; } } |
Funkcja redirect() służy do przekierowywania na stronę internetową z odpowiednim językiem. Poprzez uchwyt $browser dostajemy się do funkcji getLang() z klasy Browser.
Testujemy program:
1 2 3 4 5 6 7 8 |
<?php // index.php spl_autoload_register(function ($class) { include $class . '.php'; }); $browser = new Browser(); $url = new Web($browser); $url->redirect(); |
Jak widać, do konstruktora klasy Web przekazujemy instancję obiektu klasy Browser.
I to cała filozofia 🙂 Jeden z łatwiejszych wzorców.
Przykład na GitHub →