PHP Inheritance

Mewariskan Kode, Membangun Hierarki

Oleh: Ahmad Muyassar, S.Kom.,M.Cs

System Roadmap

01. Konsep Pewarisan
02. Keyword: extends
03. Overriding Method
04. Keyword: parent::
05. Studi Kasus RPG
01

Konsep Pewarisan

Don't Repeat Yourself (DRY)

Masalah Duplikasi Kode

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!

Solusi: Inheritance

Kita buat satu class induk (Parent) bernama Kendaraan yang berisi semua kesamaan tersebut.

Lalu Mobil dan Motor (Child) cukup mewarisi dari Kendaraan.

Istilah Penting

Analogi Biologis

Anak mewarisi sifat genetik orang tua (warna mata, rambut).

Tapi anak juga bisa punya sifat unik sendiri (bakat musik) yang tidak dimiliki orang tua.

02

Keyword extends

Menjalin Hubungan Darah

Syntax Dasar

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()
}
            

Menggunakan Warisan


$avanza = new Mobil();
$avanza->merk = "Toyota";
$avanza->klakson(); // Output: Tin tin!
            

Meskipun class Mobil kosong, ia bisa melakukan apa yang Kendaraan bisa.

Menambah Fitur Baru

Child class bisa menambahkan properti atau method sendiri.


class Mobil extends Kendaraan {
    public $jumlahPintu;
    
    public function bukaPintu() {
        echo "Pintu terbuka";
    }
}
            

Visibilitas: Protected

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.

Contoh Protected


class Kendaraan {
    protected $mesin = "V8";
}

class Mobil extends Kendaraan {
    public function cekMesin() {
        return $this->mesin; // Boleh, karena protected
    }
}
            
03

Overriding

Memodifikasi Warisan

Apa itu Overriding?

Overriding adalah kemampuan Child class untuk menimpa atau mengubah implementasi method yang diwarisi dari Parent class.

Contoh Kasus

Semua hewan bersuara. Tapi Kucing mengeong, Anjing menggonggong.


class Hewan {
    public function bersuara() {
        echo "Suara hewan...";
    }
}
            

Melakukan Override

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!";
    }
}
            

Aturan Overriding

Final Keyword

Jika Anda tidak ingin sebuah method di-override oleh anak, gunakan keyword final.


class ParentClass {
    final public function dontTouchThis() {
        // ...
    }
}
            
04

Keyword parent::

Menghormati Leluhur

Masalah Overriding Total

Kadang kita tidak ingin membuang total kode Parent, tapi hanya ingin menambahkan sesuatu.

Jika kita override biasa, kode Parent hilang.

Solusi: parent::

Gunakan parent::namaMethod() untuk memanggil kode asli dari Parent di dalam method Child.

Contoh Constructor


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;
    }
}
            

Manfaat parent::

05

Studi Kasus RPG

Role Playing Game Classes

Base Class: Character


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


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


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!";
        }
    }
}
            

Hierarki Kelas

Character
Warrior
Mage
06

Studi Kasus HR

Sistem Penggajian Karyawan

Class Karyawan


class Karyawan {
    protected $nama;
    protected $gajiPokok = 5000000;

    public function hitungGaji() {
        return $this->gajiPokok;
    }
}
            

Class Manager


class Manager extends Karyawan {
    public function hitungGaji() {
        $gajiDasar = parent::hitungGaji();
        $tunjangan = 2000000;
        return $gajiDasar + $tunjangan;
    }
}
            

Class Sales


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;
    }
}
            

Single Inheritance Only

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.

Hierarki Bertingkat

Inheritance bisa bertingkat-tingkat (Multilevel).

LivingThing -> Animal -> Mammal -> Cat

Cat mewarisi fitur dari Mammal, Animal, dan LivingThing.

Kapan Pakai Inheritance?

Liskov Substitution Principle

Salah satu prinsip SOLID.

"Object dari superclass harus bisa digantikan dengan object dari subclass tanpa mengacaukan aplikasi."

Cek Tipe: instanceof

Kita bisa mengecek apakah sebuah object adalah turunan dari class tertentu.


$budi = new Manager();
var_dump($budi instanceof Karyawan); // bool(true)
            

Kesimpulan

Terima Kasih

End of Lineage.

1 / 40