Apa itu Inheritance?
Dalam pemrograman berorientasi object (OOP) PHP, “inheritance” atau pewarisan adalah konsep di mana sebuah class dapat mewarisi sifat atau perilaku dari class lain yang disebut sebagai “parent class” atau “superclass”. Class baru yang mewarisi sifat dari parent class disebut sebagai “child class” atau “subclass”.
Dengan menggunakan inheritance, subclass dapat mengambil dan menggunakan properti dan fungsi dari parent class, serta menambahkan properti dan fungsi tambahan yang spesifik untuk subclass tersebut. Dengan cara ini, inheritance memungkinkan untuk membuat hierarki class yang lebih kompleks dan memungkinkan untuk membagi properti dan fungsi yang sama antara beberapa class.
Untuk mewarisi sifat dari parent class, subclass menggunakan kata kunci “extends” dalam deklarasi class-nya.
Mari kita lihat sebuah contoh:
Contoh
<!DOCTYPE html>
<html>
<body>
<?php
class Buah {
public $nama;
public $warna;
public function __construct($nama, $warna) {
$this->nama = $nama;
$this->warna = $warna;
}
public function intro () {
echo "Buahnya {$this->nama} dan warnanya {$this->warna}.";
}
}
// Strawberry diwarisi dari Buah
class Strawberry extends Buah {
public function message () {
echo "Apakah saya buah atau berry? ";
}
}
$strawberry = new Strawberry("Strawberry", "merah");
$strawberry->message();
$strawberry->intro();
?>
</body>
</html>
Penjelasan Contoh
Class Strawberry diwariskan dari class Buah.
Ini berarti bahwa class Strawberry dapat menggunakan properti $nama dan $warna (karena mempunyai akses public) serta fungsi __construct() dan intro() dari class Buah karena pewarisan.
Class Strawberry juga memiliki fungsinya sendiri: message().
Inheritance dan Protected Access Modifier
Dalam bab sebelumnya kita telah mempelajari bahwa properti atau fungsi protected dapat diakses di dalam class dan oleh subclass yang berasal dari class tersebut. Apa artinya itu?
Mari kita lihat sebuah contoh:
Contoh
<!DOCTYPE html>
<html>
<body>
<?php
class Buah {
public $nama;
public $warna;
public function __construct($nama, $warna) {
$this->nama = $nama;
$this->warna = $warna;
}
protected function intro() {
echo "Buahnya {$this->nama} dan warnanya {$this->warna}.";
}
}
class Strawberry extends Buah {
public function message () {
echo "Apakah saya buah atau berry? ";
}
}
// Coba panggil ketiga fungsi dari luar class
$strawberry = new Strawberry("Strawberry", "merah"); // OK. __construct() bersifat public
$strawberry->message(); // OK. message() bersifat public
$strawberry->intro(); // ERROR. intro() protected
?>
</body>
</html>
Dalam contoh di atas kita melihat bahwa jika kita mencoba memanggil fungsi protected (intro()) dari luar class, kita akan menerima kesalahan. Hanya fungsi public yang bisa dipanggil dari luar class.
Mari kita lihat contoh lain:
Contoh
<!DOCTYPE html>
<html>
<body>
<?php
class Buah {
public $nama;
public $warna;
public function __construct($nama, $warna) {
$this->nama = $nama;
$this->warna = $warna;
}
protected function intro() {
echo "Buahnya {$this->nama} dan warnanya {$this->warna}.";
}
}
class Strawberry extends Buah {
public function message () {
echo "Apakah saya buah atau berry? ";
// Panggil function yang protected dari dalam class turunan - OK
$this -> intro();
}
}
$strawberry = new Strawberry("Strawberry", "merah"); // OK. __construct() bersifat public
$strawberry->message(); // OK. message() bersifat public dan memanggil intro() yang protected dari dalam class turunan
?>
</body>
</html>
Dalam contoh di atas kita melihat bahwa semuanya bekerja dengan baik! Ini karena kita memanggil fungsi protected yaitu intro() dari dalam class turunan (subclass).
Fungsi Overriding
Fungsi yang diwariskan dapat diganti dengan mendefinisikan ulang fungsi (menggunakan nama yang sama) di class turunan, teknik ini dinamakan dengan overriding.
Lihat contoh di bawah ini. Fungsi __construct() dan intro() di class anak (Strawberry) akan menggantikan fungsi __construct() dan intro() di class induk (Buah):
Contoh
<!DOCTYPE html>
<html>
<body>
<?php
class Buah {
public $nama;
public $warna;
public function __construct($nama, $warna) {
$this->nama = $nama;
$this->warna = $warna;
}
public function intro () {
echo "Buahnya {$this->nama} dan warnanya {$this->warna}.";
}
}
class Strawberry extends Buah {
public $berat;
public function __construct($nama, $warna, $berat) {
$this->nama = $nama;
$this->warna = $warna;
$this->berat = $berat;
}
public function intro () {
echo "Buahnya {$this->nama}, warnanya {$this->warna}, dan beratnya {$this->berat} gram.";
}
}
$strawberry = new Strawberry("Strawberry", "merah", 50);
$strawberry->intro();
?>
</body>
</html>
Kata Kunci final
Kata kunci final dapat digunakan untuk mencegah pewarisan class atau untuk mencegah overriding fungsi. Class yang bersifat final tidak bisa diwariskan ke subclass apapun. Fungsi yang bersifat final tidak bisa ditulis ulang (overriding) pada subclass apapun.
Contoh berikut menunjukkan cara mencegah pewarisan class:
Contoh
<!DOCTYPE html>
<html>
<body>
<?php
final class Buah {
}
class Strawberry extends Buah {
}
?>
</body>
</html>
Contoh berikut menunjukkan cara mencegah penggantian fungsi:
Contoh
<!DOCTYPE html>
<html>
<body>
<?php
class Buah {
final public function intro () {
}
}
class Strawberry extends Buah {
// akan menghasilkan kesalahan
public function intro () {
}
}
?>
</body>
</html>
Tutorial sebelumnya : PHP Access Modifiers
Tutorial setelahnya : PHP Class Constant
Semua Tutorial PHP : Tutorial PHP