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.
property
method
Untuk menambah pemahamanmu, coba perhatikan ilustrasi inheritance berikut ini!
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.
Kendaraan
extends
Petunjuk:
RUN
<?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.
Manusia
$nama
$alamat
$umur
perkenalan()
Pekerja
$pekerjaan
$gaji
infoPekerjaan()
parent::__construct()
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:
<?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.
Ayah
motivasi()
Anak
motivasiAyah()
parent::motivasi()
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:
<?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.
OrangTua
parent::__construct($nama)
Jika ingin mencegah method tertentu agar tidak bisa ditimpa oleh class turunan, gunakan final pada deklarasi method. Contoh penggunaan final method:
<?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.
Final public function hakAkses()
Pengguna
Admin
hakAkses()
Operator instanceof digunakan untuk mengecek apakah sebuah object merupakan instance dari suatu class tertentu. Contoh penggunaan instanceof:
<?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.
instanceof
$orang1
Mahasiswa
$orang2
Dosen
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: