# Modul Pembelajaran: PHP Inheritance (Pewarisan)

## Bagian 1: Konsep Dasar

### 1.1. Apa itu Inheritance?
Inheritance (Pewarisan) adalah salah satu pilar utama Pemrograman Berorientasi Objek (OOP). Konsep ini memungkinkan sebuah class (Child/Subclass) untuk mewarisi properti dan method dari class lain (Parent/Superclass).

**Tujuan Utama:**
1.  **Code Reuse**: Menghindari duplikasi kode. Tulis kode umum sekali di Parent, gunakan berkali-kali di Child.
2.  **Hierarki**: Membangun struktur hubungan logis antar objek (e.g., Kucing ADALAH Hewan).

### 1.2. Keyword `extends`
Untuk membuat sebuah class mewarisi class lain, kita menggunakan keyword `extends`.

```php
class Kendaraan {
    public function jalan() {
        echo "Kendaraan berjalan...";
    }
}

// Mobil mewarisi semua fitur Kendaraan
class Mobil extends Kendaraan {
    public function klakson() {
        echo "Tin tin!";
    }
}

$avanza = new Mobil();
$avanza->jalan();   // Dari Parent
$avanza->klakson(); // Dari Child
```

---

## Bagian 2: Overriding Method

### 2.1. Apa itu Overriding?
Kadang, fitur yang diwariskan oleh Parent tidak sepenuhnya cocok dengan kebutuhan Child. Child class boleh **menimpa** (override) method milik Parent dengan mendefinisikan ulang method tersebut dengan nama yang sama.

### 2.2. Contoh Overriding
```php
class Hewan {
    public function bersuara() {
        echo "Suara hewan...";
    }
}

class Kucing extends Hewan {
    // Override method bersuara
    public function bersuara() {
        echo "Meong!";
    }
}
```

### 2.3. Aturan Overriding
1.  Nama method harus sama persis.
2.  Parameter harus kompatibel.
3.  Visibilitas (Public/Protected) tidak boleh lebih ketat dari Parent. (Parent Public -> Child Protected = ERROR).

---

## Bagian 3: Keyword `parent::`

### 3.1. Mengakses Parent Class
Saat kita melakukan overriding, kode asli di Parent hilang (tertimpa). Bagaimana jika kita ingin **menambahkan** fitur baru tanpa menghilangkan fitur lama?

Gunakan `parent::namaMethod()`.

### 3.2. Contoh pada Constructor
Ini sangat umum digunakan pada `__construct`.

```php
class User {
    protected $name;
    public function __construct($name) {
        $this->name = $name;
    }
}

class Admin extends User {
    protected $level;
    
    public function __construct($name, $level) {
        // Panggil constructor Parent untuk set $name
        parent::__construct($name);
        
        // Tambahan logika untuk Admin
        $this->level = $level;
    }
}
```

---

## Bagian 4: Visibilitas (Access Modifiers)

Dalam inheritance, visibilitas sangat berpengaruh:

1.  **Public**: Bisa diakses oleh siapa saja (Parent, Child, Luar).
2.  **Protected**: Bisa diakses oleh Parent dan Child, tapi **TIDAK** dari luar class.
3.  **Private**: HANYA bisa diakses oleh class itu sendiri. Child **TIDAK** bisa mengakses properti private milik Parent.

**Tips:** Gunakan `protected` untuk properti yang ingin Anda wariskan ke anak-anaknya.

---

## Bagian 5: Studi Kasus RPG (Role Playing Game)

Bayangkan membuat game RPG. Ada banyak jenis karakter: Warrior, Mage, Archer. Semuanya punya kesamaan: Punya Nama, HP (Health Points), dan bisa Menyerang.

**Parent Class: Character**
-   Properties: `$name`, `$hp`, `$damage`
-   Method: `attack($target)`

**Child Class: Mage**
-   Extends `Character`
-   New Property: `$mana`
-   Override `attack()`: Cek mana dulu, kalau ada mana, lempar api (damage lebih besar), kurangi mana. Kalau tidak, pukul biasa (panggil `parent::attack()`).

```php
class Mage extends Character {
    public function attack($target) {
        if ($this->mana > 0) {
            echo "Fireball!";
            $this->mana -= 10;
        } else {
            parent::attack($target); // Pukul pakai tongkat
        }
    }
}
```

---

## Bagian 6: Kesimpulan

-   **Inheritance** adalah hubungan "Is-A" (Adalah sebuah).
-   Gunakan `extends` untuk mewarisi.
-   Gunakan **Overriding** untuk mengubah perilaku warisan.
-   Gunakan `parent::` untuk tetap menggunakan fitur induk dalam overriding.
-   Hati-hati dengan **Single Inheritance** di PHP (satu anak hanya punya satu ayah).
