4. INHERITANCE

Pewarisan, atau inheritance, adalah konsep dalam pemrograman berorientasi objek (OOP) di mana sebuah class dapat mewarisi property dan method dari class lain. Class yang mewarisi disebut sebagai child class atau subclass, sementara class yang diwarisi disebut sebagai parent class atau superclass. Dengan pewarisan, kita dapat menghindari duplikasi kode dan memanfaatkan kembali kode yang sudah ada.

Untuk menambah pemahamanmu, coba perhatikan ilustrasi inheritance berikut ini!

Gambar 5 Hubungan Pewarisan: Kendaraan sebagai Superclass

Gambar 5 Hubungan Pewarisan: Kendaraan sebagai Superclass

Ilustrasi ini menunjukkan bahwa Mobil, Sepeda, dan Truk semuanya adalah turunan dari class Kendaraan. Hubungan "adalah" ini dibentuk dalam PHP dengan keyword extends. Class anak akan mewarisi semua property dan method dari class induknya yang bersifat public dan protected, dan dapat menambahkan atau memodifikasi fungsionalitas sesuai kebutuhan.

Contoh Penggunaan Pewarisan

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
class Manusia {
    public $nama, $alamat, $umur;

    public function __construct($nama, $alamat, $umur) {
        $this->nama = $nama;
        $this->alamat = $alamat;
        $this->umur = $umur;
    }

    public function perkenalan() {
        echo "Halo, nama saya {$this->nama}, saya berumur {$this->umur} tahun dan tinggal di {$this->alamat}.<br>";
    }
}

class Pekerja extends Manusia {
    public $pekerjaan, $gaji;

    public function __construct($nama, $alamat, $umur, $pekerjaan, $gaji) {
        parent::__construct($nama, $alamat, $umur);
        $this->pekerjaan = $pekerjaan;
        $this->gaji = $gaji;
    }

    public function infoPekerjaan() {
        echo "{$this->nama} bekerja sebagai {$this->pekerjaan} dengan gaji sebesar Rp.{$this->gaji}.<br>";
    }
}

$pekerja1 = new Pekerja("Andi", "Jakarta", 30, "Programmer", 10000000);
$pekerja1->perkenalan();
$pekerja1->infoPekerjaan();
?>

Class Manusia memiliki property $nama, $alamat, dan $umur serta method perkenalan(). Class Pekerja mewarisi class Manusia menggunakan extends dan menambahkan property $pekerjaan serta $gaji. Method perkenalan() diwarisi dari Manusia, sementara method infoPekerjaan() ditambahkan di Pekerja. Constructor di Pekerja memanggil constructor Manusia menggunakan parent::__construct() agar nilai dari class induk tetap terinisialisasi.

Overriding Method

Jika sebuah class turunan memiliki method dengan nama yang sama seperti di class induk, maka method di class turunan akan menimpa method di class induk. Jika tetap ingin memanggil method induk, gunakan parent::method(). Contoh overriding method:

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
class Ayah {
    public function motivasi() {
        echo "[Class Ayah] Nak, belajarlah dengan giat untuk masa depanmu!<br>";
    }
}

class Anak extends Ayah {
    public function motivasi() {
        echo "[Class Anak] Aku akan belajar dengan giat dan bekerja keras!<br>";
    }

    public function motivasiAyah() {
        parent::motivasi(); // Memanggil method dari class induk
    }
}

$anak1 = new Anak();
$anak1->motivasi();       // Output dari class Anak
$anak1->motivasiAyah();   // Memanggil method dari class Ayah
?>

Class Ayah memiliki method motivasi(). Class Anak mewarisi class Ayah tetapi menimpa method motivasi(). Method motivasiAyah() di class Anak menggunakan parent::motivasi() untuk tetap memanggil method dari class induk.

Constructor dalam Inheritance

PHP tidak secara otomatis memanggil constructor class induk saat class turunan memiliki constructor sendiri. Oleh karena itu, harus memanggilnya secara eksplisit menggunakan parent::__construct(). Contoh pemanggilan constructor class induk:

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
class OrangTua {
    public $nama;

    public function __construct($nama) {
        $this->nama = $nama;
        echo "Orang tua bernama {$this->nama} telah dibuat.<br>";
    }
}

class Anak extends OrangTua {
    public $hobi;

    public function __construct($nama, $hobi) {
        parent::__construct($nama); // Memanggil constructor dari class induk
        $this->hobi = $hobi;
        echo "Anak bernama {$this->nama} memiliki hobi {$this->hobi}.<br>";
    }
}

$anak1 = new Anak("Budi", "Bermain Sepak Bola");
?>

Class OrangTua memiliki constructor yang menerima parameter $nama. Class Anak memiliki constructor sendiri yang tetap memanggil constructor OrangTua menggunakan parent::__construct($nama). Output menampilkan pesan dari constructor OrangTua dan Anak.

Final Method dalam Inheritance

Jika ingin mencegah method tertentu agar tidak bisa ditimpa oleh class turunan, gunakan final pada deklarasi method. Contoh penggunaan final method:

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
class Pengguna {
    final public function hakAkses() {
        echo "Hak akses ini tidak bisa diubah oleh class turunan.<br>";
    }
}

class Admin extends Pengguna {
    // Jika mencoba menimpa method hakAkses(), akan muncul error
    /*
    public function hakAkses() {
        echo "Ini tidak boleh dilakukan.";
    }
    */
}

$admin1 = new Admin();
$admin1->hakAkses();
?>

Final public function hakAkses() dalam class Pengguna tidak bisa ditimpa oleh class Admin. Jika mencoba menulis ulang method hakAkses() di Admin, PHP akan memberikan error.

Mengecek Instance dengan instanceof

Operator instanceof digunakan untuk mengecek apakah sebuah object merupakan instance dari suatu class tertentu. Contoh penggunaan instanceof:

AYO PAHAMI!


Petunjuk:

  1. Perhatikan kode program PHP yang ditampilkan di kotak sebelah kiri.
  2. Ketik ulang seluruh baris kode tersebut ke dalam editor di sebelah kanan.
  3. Pastikan setiap baris dan struktur penulisan sesuai dengan contoh (termasuk titik koma, kurung, dll).
  4. Tekan tombol RUN di dalam editor untuk menjalankan program.
  5. Perhatikan hasil keluaran di bawah editor. Apa yang ditampilkan?
<?php
class Mahasiswa {
}

class Dosen {
}

$orang1 = new Mahasiswa();
$orang2 = new Dosen();

if ($orang1 instanceof Mahasiswa) {
    echo "Orang pertama adalah seorang Mahasiswa.<br>";
}

if ($orang2 instanceof Dosen) {
    echo "Orang kedua adalah seorang Dosen.<br>";
}
?>

instanceof digunakan untuk memeriksa apakah $orang1 merupakan instance dari Mahasiswa dan $orang2 merupakan instance dari Dosen. Hasilnya akan menampilkan bahwa $orang1 adalah Mahasiswa dan $orang2 adalah Dosen.

LATIHAN

Ayo uji pemahamanmu tentang pewarisan class di PHP!

Lengkapilah potongan kode berikut agar bisa membuat objek dari child class dan memanggil method yang diwariskan dari parent class.

<?php
class Elektronik {
    public $nama = "Televisi";

    public function hidupkan() {
        echo "Elektronik dinyalakan.";
    }
}

class Laptop ___ Elektronik {
}

$laptopBaru = new Laptop;
echo ___ . PHP_EOL;
$laptopBaru->___();
?>

Seret potongan kode berikut ke tempat yang kosong:

  • public
  • hidupkan
  • extends
  • $laptopBaru->nama