Inheritance atau Pewarisan Pada PHP

Inheritance atau pewarisan adalah hal yang akan sering kita jumpai dalam dunia pemrograman yang berorientasi objek — OOP. Sebuah class dapat mewarisi property/method dari class lain. Class yang mewarisi sifat-sifatnya disebut child class. Sedangkan class pewaris disebut parent class.

Sebuah child class hanya bisa mewarisi property/method yang memiliki visibility public dan protected. Sedangkan untuk visibility private tidak dapat diwarisi ke kelas anak.

Ketika kelas anak mewarisi method, maka ia akan memiliki fungsionalitas asli dari parent class. Kecuali kelas anak mendefinisikan ulang (Override) method tersebut. Maka ia akan memiliki method yang sama sekali baru dari segi fungsionalitas.

Cara Mewarisi Class

Untuk mewarisi sebuah class dilakukan dengan cara menuliskan extends setelah nama class — yang akan mewarisidiikuti dengan nama class pewaris. Adapun contohnya adalah sebagai berikut:

Selanjutnya mari kita coba menambahkan beberapa property dan method pada class Person sehingga akan terlihat bagaimana class Student mampu mewarisi sifat-sifat parent-nya.

Inherit Class dengan Properti Publik
Output kode di atas

Kita lihat pada baris ke 25–26, meskipun class Student tidak mendefinisikan property name dan age, tapi kita dapat menggunakan property tersebut. Hal ini dikarenakan ia telah mewarisi sifat class Person yang telah memiliki property tersebut (Lihat baris 5 dan 6). Pun pada method greetings dan introduce.

Protected vs Private

Seperti yang telah disinggung pada awal pembahasan, visibility private hanya tersedia pada class itu sendiri. Oleh karena itu ketika kita meng-extend sebuah class yang memiliki property/method dengan visibilitas privat, maka kita tidak dapat menggunakannya pada kelas anak.

Sekarang mari kita coba modifikasi kode sebelumnya dengan mengganti visibilitasnya menjadi protected. Berikut ini hasilnya:

Contoh Mengakses Visibilty Protected Pada Parent Class
Output kode di atas

Perhatikan potongan baris kode ke 30–33 sebagai berikut:

public function setName($name)    
{
parent::setName($name);
}

Selanjutnya di baris ke 52 terdapat kode berikut:

$student->setName('John Doe');

Mungkin sebagian dari kita bertanya-tanya, kenapa kita mendefinisikan ulang metode setName? Padahal kode tersebut sudah ada di parent class pada baris ke 7–10. Jika timbul pertanyaan seperti itu, Anda perlu membaca artikel mengenai visibilitas pada PHP. Atau jika Anda enggan membaca artikel tersebut, simak saja petunjuk kecil di bawah ini.

Property/method yang memiliki visibilitas protected hanya dapat diakses dari dalam class.

Kembali ke potongan kode pada baris 30–33, karena metode setName pada parent class itu protected, maka kita tidak dapat langsung memanggil kode tersebut dengan cara $student->setName('John Doe'); . Karena itu, kita perlu meng-override metode tersebut dengan cara mengganti visibilitasnya menjadi public . Sehingga kita dapat memanggil metode setName dari luar class.

Karena tujuan kita meng-override metode setName tersebut hanya untuk mengubah visibilitasnya, maka kita tidak perlu menulis ulang kode $this->name = $name; . Kita dapat memanfaatkan kode sebelumnya dengan cara memanggil metode setName di parent class dengan cara parent::setName($name) . Jadi jika kita urutkan alur proses yang terjadi adalah:

  1. $student->setName('John Doe') memanggil public methodsetName yang ada pada class Student
  2. Selanjutnya class Student memanggil protected methodsetName yang ada pada class Person melalui kode parent::setName($name)

Kita dapat memanggil parent method dengan cara menggunakan kata kunci parent diikuti nama metodenya. Contoh: parent::sayHello()

Perhatikan kembali potongan kode pada baris ke 40–43 sebagai berikut:

public function salaam()    
{
return $this->greetings();
}

Selanjutnya baris kode ke 55 berikut:

echo $student->salaam();

Jika kita lihat pada dua potongan kode di atas, kita membuat sebuah metode baru bernama salaam pada class Student . Selanjutnya isi dari metode tersebut adalah memanggil metode greetings yang terdapat pada parent class menggunakan $this diikuti nama metodenya.

Pada contoh sebelumnya kita menggunakan kata kunciparent untuk memanggil parent method. Lalu kenapa kali ini menggunakan $this ? Bisa kah kita menggunakan $this pada contoh sebelumnya? Lalu bisa kah kita menggunakan parent pada contoh kedua ini? Jawabannya adalah it depends!

Pada kata kunci parent kita menginstruksikan untuk memanggil metode pada parent class. Sedangkan pada $this dapat mengindikasikan memanggil metode dari parent maupun self class.

Dengan kata lain kita tidak dapat menggunakan $this pada contoh pertama. Karena metode setName terdapat pada parent dan dirinya sendiri (Self). Sedangkan pada contoh kedua kita dapat menggunakan kata kunci parent maupun $this dikarenakan child class tersebut tidak memiliki metode greetings. Adapun metode yang dipakai adalah salaam yang akan memanggil metode greetings .

Sekarang kita coba modifikasi kembali kode sebelumnya menggunakan visibility private.

Contoh Mengakses Visibilty Private Pada Parent Class
Error Saat Mengakses Private Method

Terlihat kita gagal menggunakan metode setName yang dimiliki class Person karena metode tersebut bersifat private dan hanya dapat diakses dari dalam class Person dan tidak pada class Student yang menjadi kelas anak.

)
Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade