Penggunaan Antara Muka dalam OOP dalam PHP
Jadi, kita telah mengetahui bahawa antara muka adalah cara yang baik untuk mengawal bahawa semua kaedah kelas yang diperlukan telah dilaksanakan.
Mari kita lihat satu lagi contoh yang lebih praktikal. Katakan kita mempunyai kelas yang akan menyimpan pelbagai objek bentuk:
<?php
class FiguresCollection
{
private $figures = []; // array untuk bentuk
}
?>
Mari kita laksanakan kaedah addFigure
dalam kelas kita untuk menambahkan objek ke dalam koleksi:
<?php
class FiguresCollection
{
private $figures = [];
// Objek dengan bentuk dihantar sebagai parameter:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Jelas sekali, kita menjangkakan bahawa
parameter kaedah addFigure akan
menghantar objek dengan bentuk. Namun, tiada
sebarang kawalan ke atas ini!
Mari kita gunakan petunjuk untuk jenis dan
nyatakan jenis objek secara jelas sebagai Figure:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Mari kita fahami apa yang telah kita lakukan.
Jika Figure adalah kelas yang benar-benar wujud,
maka kita boleh menghantar objek kelas tersebut, dan juga
pewarisnya, ke dalam parameter kaedah.
Bagaimanapun, bagi kami, Figure adalah antara muka.
Dalam kes ini, petunjuk menunjukkan bahawa
hanya objek kelas yang melaksanakan antara muka kami
boleh dihantar sebagai parameter kaedah.
Mari kita cuba mencipta objek kelas kami dan menambahkan bentuk ke dalamnya:
<?php
$figuresCollection = new FiguresCollection;
// Tambahkan beberapa segi empat sama:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Tambahkan beberapa segi empat tepat:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Cuba menambahkan objek kelas lain akan menyebabkan ralat:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // beberapa kelas lain
$figuresCollection->add(new Test); // akan menghasilkan ralat
?>
Apa yang praktikalnya diberikan oleh kawalan sedemikian kepada kami:
kerana semua bentuk yang ditambahkan ke dalam koleksi
melaksanakan antara muka Figure, kami boleh
yakin bahawa setiap satu daripadanya akan mempunyai kaedah
getSquare dan kaedah
getPerimeter.
Mungkin pada masa hadapan selain segi empat sama dan segi empat tepat
akan wujud, contohnya, segi tiga. Dalam
kes ini, segi tiga juga akan mempunyai
kaedah getSquare dan
getPerimeter.
Secara praktikal, ini memberikan kami perkara berikut: kami boleh
dalam kelas FiguresCollection membuat,
contohnya, kaedah getTotalSquare, yang mencari
jumlah luas bentuk koleksi. Dalam kaedah ini
kami akan mengulangi array bentuk dengan gelung dan
setiap bentuk memanggil
kaedah getSquare.
Oleh kerana setiap bentuk melaksanakan antara muka
Figure, kami boleh 100%
yakin bahawa setiap bentuk akan mempunyai
kaedah getSquare ini.
Jadi, berikut adalah pelaksanaan kaedah:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Cari jumlah luas:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // gunakan kaedah getSquare
}
return $sum;
}
}
?>
Tanpa mengintip kod saya, laksanakan
kelas FiguresCollection yang sama.
Tambahkan kaedah getTotalPerimeter
ke dalam kelas FiguresCollection
untuk mencari jumlah perimeter semua bentuk.