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 mewarisi — diikuti 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.

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:

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:
$student->setName('John Doe')memanggil public methodsetNameyang ada padaclass Student- Selanjutnya
class Studentmemanggil protected methodsetNameyang ada padaclass Personmelalui kodeparent::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.

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.
