Tutorial PHP #22: Inheritance, Encapsulation, dan Polymorphism di PHP

1. Inheritance (Pewarisan)

Inheritance memungkinkan sebuah class mewarisi property dan method dari class lain. Class yang mewarisi disebut child class, class yang diwarisi disebut parent class. Ini mengurangi pengulangan kode.

<?php
// Parent class
class User {
    public string $nama;
    public string $email;

    public function __construct(string $nama, string $email) {
        $this->nama  = $nama;
        $this->email = $email;
    }

    public function info(): string {
        return "User: {$this->nama} ({$this->email})";
    }
}

// Child class - mewarisi semua dari User
class Admin extends User {
    public string $level;

    public function __construct(string $nama, string $email, string $level) {
        parent::__construct($nama, $email);   // panggil constructor parent
        $this->level = $level;
    }

    public function info(): string {
        return "Admin [{$this->level}]: {$this->nama} ({$this->email})";
    }
}

$user  = new User("Budi", "budi@mail.com");
$admin = new Admin("Ariq", "ariq@mail.com", "Super Admin");

echo $user->info();    // Output: User: Budi (budi@mail.com)
echo $admin->info();   // Output: Admin [Super Admin]: Ariq (ariq@mail.com)
?>

2. Encapsulation (Enkapsulasi)

Enkapsulasi adalah konsep menyembunyikan detail internal class dan hanya mengekspos apa yang diperlukan. Tujuannya: mencegah perubahan data yang tidak valid.

<?php
class Pegawai {
    private string $nama;
    private float $gaji;
    protected string $departemen;

    public function __construct(string $nama, float $gaji, string $dept) {
        $this->nama        = $nama;
        $this->setGaji($gaji);   // lewat setter agar ada validasi
        $this->departemen  = $dept;
    }

    public function getNama(): string { return $this->nama; }
    public function getGaji(): float  { return $this->gaji; }

    public function setGaji(float $gaji): void {
        if ($gaji < 0) throw new InvalidArgumentException("Gaji tidak boleh negatif");
        $this->gaji = $gaji;
    }

    public function info(): string {
        return "{$this->nama} - {$this->departemen} - Rp " . number_format($this->gaji);
    }
}

$peg = new Pegawai("Ariq", 8000000, "Engineering");
echo $peg->info();        // Output: Ariq - Engineering - Rp 8.000.000
$peg->setGaji(9000000);   // Update gaji via setter
// $peg->gaji = -100;     // ERROR! property private
?>

3. Polymorphism (Polimorfisme)

Polymorphism berarti satu interface (nama method yang sama) bisa berperilaku berbeda tergantung class yang mengimplementasikannya.

<?php
class Hewan {
    public string $nama;

    public function __construct(string $nama) {
        $this->nama = $nama;
    }

    public function suara(): string {
        return "...";   // method dasar
    }
}

class Kucing extends Hewan {
    public function suara(): string {
        return "{$this->nama} bersuara: Meow!";
    }
}

class Anjing extends Hewan {
    public function suara(): string {
        return "{$this->nama} bersuara: Woof!";
    }
}

class Sapi extends Hewan {
    public function suara(): string {
        return "{$this->nama} bersuara: Moo!";
    }
}

// Polymorphism: memanggil method yang sama, hasil berbeda
$hewan = [new Kucing("Kitty"), new Anjing("Rex"), new Sapi("Moo")];

foreach ($hewan as $h) {
    echo $h->suara() . "<br>";
}
// Output:
// Kitty bersuara: Meow!
// Rex bersuara: Woof!
// Moo bersuara: Moo!
?>

4. Method Override dan parent::

<?php
class Kendaraan {
    public function deskripsi(): string {
        return "Ini adalah kendaraan";
    }
}

class Mobil extends Kendaraan {
    public string $merk;

    public function __construct(string $merk) {
        $this->merk = $merk;
    }

    // Override method parent
    public function deskripsi(): string {
        // Bisa panggil method parent dulu, lalu tambahkan
        return parent::deskripsi() . " - Mobil merk {$this->merk}";
    }
}

$mobil = new Mobil("Toyota");
echo $mobil->deskripsi();
// Output: Ini adalah kendaraan - Mobil merk Toyota
?>

5. Ringkasan

  • Inheritance: class mewarisi property dan method dari parent class menggunakan extends
  • Encapsulation: sembunyikan detail internal, expose via getter/setter
  • Polymorphism: method yang sama berperilaku berbeda di class berbeda
  • Gunakan parent:: untuk mengakses method parent dari child class

Tutorial berikutnya membahas interface, trait, dan abstract class.