Penerapan Interface dalam OOP di PHP
Jadi, kita sudah mengetahui bahwa interface adalah cara yang baik untuk mengontrol bahwa semua method kelas yang diperlukan telah diimplementasikan.
Mari kita lihat contoh lain yang lebih praktis. Misalkan kita memiliki kelas yang akan menyimpan array objek-objek bentuk:
<?php
class FiguresCollection
{
private $figures = []; // array untuk bentuk
}
?>
Mari implementasikan method addFigure
di kelas kita untuk menambahkan objek ke koleksi:
<?php
class FiguresCollection
{
private $figures = [];
// Objek dengan bentuk diteruskan sebagai parameter:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Jelas bahwa kita berasumsi bahwa
parameter method addFigure akan
berisi objek dengan bentuk. Namun tidak ada
kontrol untuk hal ini!
Mari gunakan petunjuk tipe dan
secara eksplisit tentukan tipe objek sebagai Figure:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Mari kita pahami apa yang telah kita lakukan.
Jika Figure adalah kelas yang benar-benar ada,
maka kita bisa meneruskan objek dari kelas tersebut ke parameter method,
serta juga objek dari turunannya.
Namun bagi kita, Figure adalah sebuah interface.
Dalam hal ini, petunjuk tipe berarti bahwa
parameter method hanya dapat berisi
objek kelas yang mengimplementasikan interface kita.
Mari coba buat objek dari kelas kita dan tambahkan bentuk-bentuk ke dalamnya:
<?php
$figuresCollection = new FiguresCollection;
// Tambahkan beberapa persegi:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Tambahkan beberapa persegi panjang:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Upaya untuk menambahkan objek dari kelas lain akan menyebabkan error:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // kelas lain
$figuresCollection->add(new Test); // akan menghasilkan error
?>
Apa yang diberikan kontrol seperti ini dalam praktik:
karena semua bentuk yang ditambahkan ke koleksi
mengimplementasikan interface Figure, kita bisa
yakin bahwa setiap bentuk akan memiliki method
getSquare dan method
getPerimeter.
Mungkin di masa depan selain persegi dan persegi panjang
akan muncul, misalnya, segitiga. Dalam
hal ini, segitiga juga akan memiliki
method getSquare dan
getPerimeter.
Dalam praktiknya, ini memberi kita hal berikut: kita bisa
di kelas FiguresCollection membuat,
contohnya, method getTotalSquare yang mencari
luas total bentuk-bentuk koleksi. Dalam method ini
kita akan melakukan perulangan melalui array bentuk dan
pada setiap bentuk memanggil
method getSquare.
Karena setiap bentuk mengimplementasikan interface
Figure, kita bisa 100%
yakin bahwa setiap bentuk akan memiliki
method getSquare ini.
Jadi, berikut adalah implementasi methodnya:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Cari luas total:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // gunakan method getSquare
}
return $sum;
}
}
?>
Tanpa melihat kode saya, implementasikan
kelas FiguresCollection yang sama.
Tambahkan ke kelas FiguresCollection
method getTotalPerimeter untuk mencari
keliling total semua bentuk.