Program berorientasi objek dibangun melalui struktur hierarki kelas. Dalam bahasa pewarisan tunggal seperti PHP, pewarisan kelas bersifat seperti pohon. Kelas akar memiliki satu atau lebih subkelas, dan kemudian satu atau lebih subkelas diwarisi dari setiap subkelas . Tentu saja, mungkin ada beberapa kelas root yang digunakan untuk mengimplementasikan fungsi berbeda. Dalam arsitektur yang dirancang dengan baik, setiap kelas root harus memiliki antarmuka berguna yang dapat digunakan oleh kode aplikasi. Jika kode aplikasi kita dirancang untuk bekerja dengan kelas root, kode tersebut juga dapat bekerja dengan subkelas mana pun yang mewarisi kelas root.
Metode abstrak sama seperti pengganti metode biasa dalam subkelas (memerlukan ruang tetapi tidak berpengaruh), tetapi tidak seperti metode biasa, metode ini tidak memiliki kode apa pun. Jika terdapat satu atau lebih metode abstrak dalam suatu kelas, maka kelas tersebut menjadi kelas abstrak. Anda tidak dapat membuat instance kelas abstrak. Anda harus mewarisinya dan kemudian membuat instance subkelas. Anda juga dapat menganggap kelas abstrak sebagai templat untuk subkelas.
Jika Anda mengganti semua metode abstrak, subkelas menjadi kelas normal. Jika semua metode tidak diganti, subkelasnya tetap abstrak. Jika suatu kelas berisi metode abstrak (walaupun hanya ada satu), Anda harus mendeklarasikan kelas tersebut menjadi abstrak dengan menambahkan abstrak sebelum kata kunci class.
Sintaks mendeklarasikan metode abstrak berbeda dengan mendeklarasikan metode umum. Metode abstrak tidak memiliki isi utama yang terdapat dalam kurung kurawal {} seperti metode umum, dan diakhiri dengan titik koma;.
Pada Contoh 6.13, kita mendefinisikan kelas Shape yang berisi metode getArea. Namun karena tidak mungkin menentukan luas bangun tanpa mengetahui bentuknya, kami mendeklarasikan metode getArea sebagai metode abstrak. Anda tidak dapat membuat instance objek Bentuk, namun Anda dapat mewarisinya atau menggunakannya dalam ekspresi, seperti pada Contoh 6.13.
Jika Anda membuat kelas hanya dengan metode abstrak, Anda mendefinisikan antarmuka. Untuk menggambarkan situasi ini, PHP memiliki antarmuka dan mengimplementasikan kata kunci. Anda dapat menggunakan antarmuka alih-alih kelas abstrak dan implementasi alih-alih perluasan untuk mendeskripsikan definisi kelas Anda atau misalnya, Anda dapat menulis implementasi myClass myIterface. Anda dapat memilih di antara kedua metode ini berdasarkan preferensi pribadi.
/*Catatan:
Kedua metode tersebut mengacu pada:
1. kelas abstrak aaa{} (perhatikan bahwa hanya ada metode abstrak di aaa, tidak ada metode umum)
class bbb extends aaa{} (timpa metode abstrak di aaa di bbb)
2. antarmuka aaa{}
kelas bbb mengimplementasikan aaa{} (timpa metode abstrak di aaa di bbb)
*/
Listing 6.13 Kelas abstrak
//kelas akar abstrak kelas akar abstrak
kelas abstrak Bentuk
{
fungsi abstrak getArea(); //Mendefinisikan metode abstrak
}
//subkelas abstrak kelas anak abstrak
kelas abstrak Poligon memperluas Bentuk //Poligon
{
fungsi abstrak getNumberOfSides();
}
//kelas beton kelas entitas kelas segitiga
kelas Segitiga memperluas Poligon
{
publik $basis;
public $height;
public function getArea() //Ganti metode penghitungan luas{
return(($ini->dasar * $ini->tinggi)/2);
}
fungsi publik getNumberOfSides() //Ganti metode penghitungan sisi{
kembali(3);
}
}
//kelas entitas kelas beton segiempat
kelas Rectangle memperluas Poligon
{
publik $lebar;
publik $tinggi;
fungsi publik getArea()
{
return($ini->lebar * $ini->tinggi);
}
fungsi publik getNumberOfSides()
{
kembali(4);
}
}
//lingkaran kelas entitas kelas konkrit
kelas Lingkaran memperluas Bentuk
{
publik $radius;
fungsi publik getArea()
{
return(pi() * $ini->radius * $ini->radius);
}
}
//kelas akar konkret mendefinisikan kelas warna
kelasWarna
{
publik $nama;
}
$myCollection = array(); //Membuat kumpulan bentuk dan memasukkannya ke dalam array
//membuat persegi panjang
$r = Persegi Panjang baru;
$r->lebar = 5;
$r->tinggi = 7;
$koleksisaya[] = $r;
unset($r);
//membuat segitiga
$t = Segitiga baru;
$t->basis = 4;
$t->tinggi = 5;
$koleksisaya[] = $t;
unset($t);
//membuat lingkaran
$c = Lingkaran baru;
$c->radius = 3;
$koleksisaya[] = $c;
unset($c);
//membuat warna
$c = Warna baru;
$c->nama = "biru";
$koleksisaya[] = $c;
tidak disetel($c);
foreach($myCollection sebagai $s)
{
if($s instanceof Shape) //Jika $s adalah turunan dari kelas Shape{
print("Area: " .$s->getArea() . "n");
}
if($s contoh Poligon)
{
print("Sisi: " .$s->getNumberOfSides()."n");
}
if($s contoh Warna)
{
print("Warna: $s->nama n");
}
mencetak("n");
}
?>