Ketika Class A membutuhkan Class B untuk bekerja, itu artinya class A dependent terhadap Class B. Hal seperti ini perlu kita hindari. Class yang baik adalah yang loose coupling, tidak terikat dengan class yang lain. Hal ini juga menjaga prinsip OOP Single Responsibility Principle yang menyatakan bahwa satu Class hanya mengerjakan satu tugas. Untuk mengatasi hal ini, gunakan Dependency Injection.
Kita membuat instance object di luar object yang membutuhkannya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php class Batmobile{ protected $sopir; public function __construct($sopir){ $this->sopir = $sopir; } public function getSopir(){ return $this->sopir; } } class Batman{ public function nama($nama){ return $nama; } } $batman = new Batman(); $batmobile = new Batmobile($batman); echo $batmobile->getSopir()->nama('Batman Manusia Kelelawar'); |
Hasilnya adalah Batman Manusia Kelelawar.
Type Hinting pada Dependency Injection
Dari contoh di atas, untuk memastikan bahwa constructor Batmobile{} menerima instance Batman{}, kita bisa menggunakan type hinting.
Kita perlu membuat interface Sopir, karena yang menyetir Batmobile nantinya tidak cuma batman, tapi juga android.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php class Batmobile{ protected $sopir; public function __construct(Sopir $sopir){ $this->sopir = $sopir; } public function getSopir(){ return $this->sopir; } } interface Sopir{ public function nama($nama); } class Batman implements Sopir{ public function nama($nama){ return 'Halo saya ' . $nama . '<br>'; } } class Android implements Sopir{ public function nama($nama){ return 'Beep..beep.. saya ' . $nama . '<br>'; } } $batman = new Batman(); $batmobile = new Batmobile($batman); echo $batmobile->getSopir()->nama('Batman Manusia Kelelawar'); $android = new Android(); $batmobile = new Batmobile($android); echo $batmobile->getSopir()->nama('Android Driver'); |