Memahami Penggunaan Class Interface Pada PHP
- Published on
- -3 mins read
- Authors
- Name
- Muhammad Iqbal
- @dibaliqaja
Interface Class
Kita telah tahu, bahwa sebuah interface didefinisikan dengan kata kunci interface
dan semua method di dalamnya yang bersifat abstrak. Semua method/function yang dideklarasikan
di dalam interface harus bersifat public. Contoh dari interface
<?php
interface Payment{ public function send();}
Di dalam sebuah interface, body method tidak didefinisikan secara langsung, yang didefinisikan secara langsung yaitu hanya nama dan parameternya. Jika kita tidak menggunakan interface, apa yang akan jadi masalah kita? Mengapa kita perlu implementasi sebuah interface?
Lihat kode yang ada dibawah ini
<?php
class payWithBankA { public function send($pay) { var_dump('Melakukan pembayaran dengan metode Bank A sebesar : ' . $pay); }}
class payWithBankB { public function send($pay) { var_dump('Melakukan pembayaran dengan metode Bank B sebesar : ' . $pay); }}
class OrderController { protected $payment; public function __construct(payWithBankA $payment) { $this->payment = $payment; } public function store() { $pay = 10000; $this->payment->send($pay); }}
$controller = new OrderController(new payWithBankA);$controller->store();
Dalam contoh di atas, kita tidak menggunakan interface. Kita menulis method send di dalam sebuah class payWithBankA.
Tetapi, jika saya ingin menulis method send menggunakan payWithBankB, kita harus mengubah juga referensi class dengan hard-code pada kode di atas pada baris nomor 23.
Kode tersebut adalah
public function __construct(payWithBankA $payment)
Dan apabila kita menggantinya, akan menjadi sepert ini
public function __construct(payWithBankB $payment)
Dalam sebuah project yang besar, jika kita memiliki banyak class dan kita perlu mengubahnya, kita harus mengubah semua class secara manual.
Dan disini, dengan menggunakan interface. Masalah kita akan terpecahkan. Dan kita tidak perlu mengubah satu persatu secara manual.
Sekarang, lihat kode yang berikut dan coba kita pahami apa yang terjadi ketika kita menggunakan interface.
<?php
interface Payment { public function send($pay);}
class payWithBankA implements Payment { public function send($pay) { var_dump('Melakukan pembayaran dengan metode Bank A sebesar : ' . $pay); }}
class payWithBankB implements Payment { public function send($pay) { var_dump('Melakukan pembayaran dengan metode Bank B sebesar : ' . $pay); }}
class OrderController { protected $payment; public function __construct(Payment $payment) { $this->payment = $payment; } public function store() { $pay = 10000; $this->payment->send($pay); }}
$controller = new OrderController(new payWithBankA);$controller->store();
$controller = new OrderController(new payWithBankB);$controller->store();
Sekarang, jika kita mengubah dari payWithBankA
ke payWithBankB
, kita tidak perlu mengubah metode konstruktor secara manual.
Pada konstruktor, kita telah menyuntikkan ( inject ) sebuah interface, dan bukan sebuah class.
Pada contoh di atas, kita passing parameter pay menggunakan payWithBankA
dan sekarang kita
ingin menulis passing parameter pay menggunakan payWithBankB
. Dan kita bisa menulisnya seperti ini tanpa perlu mengubah
constructor seperti yang sebelumnya.
$controller = new OrderController(new payWithBankB);$controller->store();
Kita akan mendapatkan hasil tanpa mengubah class yang lain karena interface menangani masalah pada tempat tersebut.
Sekian dan Semoga bermanfaat. Sampai Jumpa.