Pelbagai Antara Muka dalam OOP PHP
PHP tidak mempunyai pewarisan berbilang - setiap
kelas hanya boleh mempunyai satu induk.
Walau bagaimanapun, keadaan berbeza dengan antara muka:
setiap kelas boleh melaksanakan sebarang bilangan
antara muka. Untuk melakukan ini, nama antara muka
perlu disenaraikan dipisahkan dengan koma selepas kata kunci
implements.
Ini menunjukkan satu lagi perbezaan antara muka dari kelas abstrak - anda boleh melaksanakan banyak antara muka, tetapi mewarisi beberapa kelas abstrak adalah tidak boleh.
Mari kita cuba secara praktikal. Katakan selain
antara muka iFigure, kita juga mempunyai
antara muka iTetragon.
Kaedah antara muka ini akan dilaksanakan oleh
kelas Quadrate dan Rectangle,
kerana mereka mempunyai 4 sisi, tetapi bukan kelas
Disk.
Katakan antara muka iTetragon menerangkan
pengambil (getter) untuk semua empat sisi
segi empat:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Katakan juga kita mempunyai antara muka iFigure,
yang telah kita buat sebelum ini:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Mari kita buat agar kelas Quadrate
melaksanakan dua antara muka. Untuk ini, senaraikan
kedua-dua antara muka dipisahkan dengan koma selepas kata kunci
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// di sini akan ada pelaksanaan
}
?>
Sekarang mari kita selesaikan kelas Quadrate kami,
agar ia melaksanakan antara muka iTetragon.
Jelas bahwa segi empat sama kami adalah kes
menyusut segi empat, kerana segi empat sama
semua sisinya adalah sama. Oleh itu, semua kaedah baru
akan mengembalikan perkara yang sama - lebar segi empat sama:
<?php
class Quadrate implements iFigure, iTetragon
{
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->a;
}
public function getC()
{
return $this->a;
}
public function getD()
{
return $this->a;
}
public function getSquare()
{
return $this->a * $this->a;
}
public function getPerimeter()
{
return 4 * $this->a;
}
}
?>
Jelas bahwa dalam segi empat tepat, tidak semua
sisi adalah sama, hanya sisi bertentangan.
Dalam kes ini, kaedah baru akan menjadi sedikit
berbeza. Dan, dalam mana-mana trapezium
secara umumnya semua 4 sisi akan berbeza.
Walau bagaimanapun, tidak kira apa bentuk yang akan kita pertimbangkan - yang penting adalah semua bentuk ini akan mempunyai kaedah yang diterangkan (walaupun beberapa bentuk adalah menyusut) dan berfungsi dengan cara yang seragam.
Buat agar kelas Rectangle
juga melaksanakan dua antara muka: kedua-dua iFigure,
dan iTetragon.
Buat antara muka iCircle dengan kaedah
getRadius dan getDiameter.
Buat agar kelas Disk juga
melaksanakan dua antara muka: kedua-dua iFigure,
dan iCircle.