Mewariskan Kode, Membangun Hierarki
Don't Repeat Yourself (DRY)
Bayangkan kita punya class Mobil dan Motor.
Keduanya punya properti $merk, $kecepatan, dan method jalan().
Menulis ulang kode yang sama di kedua class adalah pemborosan!
Kita buat satu class induk (Parent) bernama Kendaraan yang berisi semua kesamaan tersebut.
Lalu Mobil dan Motor (Child) cukup mewarisi dari Kendaraan.
Anak mewarisi sifat genetik orang tua (warna mata, rambut).
Tapi anak juga bisa punya sifat unik sendiri (bakat musik) yang tidak dimiliki orang tua.
Menjalin Hubungan Darah
Gunakan keyword extends setelah nama class anak.
class Kendaraan {
public $merk;
public function klakson() {
echo "Tin tin!";
}
}
class Mobil extends Kendaraan {
// Mobil otomatis punya $merk dan klakson()
}
$avanza = new Mobil();
$avanza->merk = "Toyota";
$avanza->klakson(); // Output: Tin tin!
Meskipun class Mobil kosong, ia bisa melakukan apa yang Kendaraan bisa.
Child class bisa menambahkan properti atau method sendiri.
class Mobil extends Kendaraan {
public $jumlahPintu;
public function bukaPintu() {
echo "Pintu terbuka";
}
}
Properti/Method private milik Parent TIDAK bisa diakses oleh Child.
Gunakan protected jika ingin fitur tersebut bisa diakses oleh Child tapi tertutup dari dunia
luar.
class Kendaraan {
protected $mesin = "V8";
}
class Mobil extends Kendaraan {
public function cekMesin() {
return $this->mesin; // Boleh, karena protected
}
}
Memodifikasi Warisan
Overriding adalah kemampuan Child class untuk menimpa atau mengubah implementasi method yang diwarisi dari Parent class.
Semua hewan bersuara. Tapi Kucing mengeong, Anjing menggonggong.
class Hewan {
public function bersuara() {
echo "Suara hewan...";
}
}
Cukup buat method dengan nama yang sama di Child class.
class Kucing extends Hewan {
public function bersuara() {
echo "Meong!";
}
}
class Anjing extends Hewan {
public function bersuara() {
echo "Guk guk!";
}
}
Jika Anda tidak ingin sebuah method di-override oleh anak, gunakan keyword final.
class ParentClass {
final public function dontTouchThis() {
// ...
}
}
Menghormati Leluhur
Kadang kita tidak ingin membuang total kode Parent, tapi hanya ingin menambahkan sesuatu.
Jika kita override biasa, kode Parent hilang.
Gunakan parent::namaMethod() untuk memanggil kode asli dari Parent di dalam method Child.
class Produk {
public $nama;
public function __construct($nama) {
$this->nama = $nama;
}
}
class Buku extends Produk {
public $penulis;
public function __construct($nama, $penulis) {
// Panggil constructor parent dulu
parent::__construct($nama);
$this->penulis = $penulis;
}
}
Role Playing Game Classes
class Character {
protected $name;
protected $hp = 100;
protected $damage = 10;
public function __construct($name) {
$this->name = $name;
}
public function attack($target) {
echo "$this->name menyerang $target->name!";
}
}
class Warrior extends Character {
// Warrior punya HP lebih tebal
protected $hp = 200;
public function attack($target) {
parent::attack($target);
echo " Serangan pedang mematikan!";
}
}
class Mage extends Character {
private $mana = 100;
public function attack($target) {
if ($this->mana > 10) {
parent::attack($target);
echo " Bola api dilemparkan!";
$this->mana -= 10;
} else {
echo "Mana habis!";
}
}
}
Sistem Penggajian Karyawan
class Karyawan {
protected $nama;
protected $gajiPokok = 5000000;
public function hitungGaji() {
return $this->gajiPokok;
}
}
class Manager extends Karyawan {
public function hitungGaji() {
$gajiDasar = parent::hitungGaji();
$tunjangan = 2000000;
return $gajiDasar + $tunjangan;
}
}
class Sales extends Karyawan {
private $komisi;
public function __construct($nama, $komisi) {
$this->nama = $nama;
$this->komisi = $komisi;
}
public function hitungGaji() {
return parent::hitungGaji() + $this->komisi;
}
}
Ingat! PHP hanya mendukung Single Inheritance.
Sebuah class hanya boleh punya SATU parent.
class Anak extends Ayah, Ibu { // ERROR! }
Gunakan Interface atau Traits untuk kebutuhan multiple behavior.
Inheritance bisa bertingkat-tingkat (Multilevel).
LivingThing -> Animal -> Mammal -> Cat
Cat mewarisi fitur dari Mammal, Animal, dan
LivingThing.
Salah satu prinsip SOLID.
"Object dari superclass harus bisa digantikan dengan object dari subclass tanpa mengacaukan aplikasi."
Kita bisa mengecek apakah sebuah object adalah turunan dari class tertentu.
$budi = new Manager();
var_dump($budi instanceof Karyawan); // bool(true)
extends untuk mewarisi.parent:: untuk akses fitur induk.End of Lineage.