Setelah mempelajari Pengertian Constructor dan Destructor dalam OOP PHP, kali ini kita akan membahas Pengertian Inheritance atau Pewarisan dalam Pemrograman Objek, serta melihat contoh penggunaannya.
Pengertian Inheritance (Pewarisan) dalam OOP
Inheritance adalah konsep OOP dimana sebuah class dapat menurunkan property dan method yang dimilikinya kepada class lain. Konsep inheritance dipakai untuk memanfaatkan fitur code reuse, yakni menghindari terjadinya duplikasi kode program.
Dalam bahasa Indonesia, inheritance ini disebut juga sebagai pewarisan atau penurunan.
Konsep inheritance membuat sebuah struktur atau hierarchy class dalam kode program. Class yang akan diturunkan bisa disebut sebagai class induk (parent class), super class, atau base class.
Sedangkan class yang menerima penurunan bisa disebut sebagai class anak (child class), sub class, derived class atau heir class.
Tidak semua property dan method class induk akan diturunkan. Property dan method dengan hak akses private tidak akan diturunkan kepada class anak. Hanya property dan method dengan hak akses protected dan public saja yang bisa diakses dari class anak.
Cara Penggunaan Inheritance dalam PHP
Di dalam PHP, inheritance atau penurunan sebuah class kepada class lain menggunakan keyword extends, dengan penulisan dasar sebagai berikut:
class induk { //...isi class induk } class anak extends induk { //... class anak bisa mengakses //... property dan method class induk }
Agar lebih mudah dipahami, kita akan langsung masuk ke dalam contoh program penggunaan inheritance PHP:
<?php // buat class induk: komputer class komputer { Â Â Â public $merk; Â Â public $processor; Â Â public $memory; Â Â Â public function beli_komputer() { Â Â Â Â return "Beli komputer baru"; Â Â } } Â // turunkan class komputer ke laptop class laptop extends komputer { Â Â Â public function lihat_spec() { Â Â Â Â return "merk: $this->merk, processor: $this->processor, memory: $this->memory"; Â Â } } Â // buat objek dari class laptop (instansiasi) $laptop_baru = new laptop(); Â // isi property objek $laptop_baru->merk = "acer"; $laptop_baru->processor ="intel core i5"; $laptop_baru->memory = "2 GB"; Â //panggil method objek echo $laptop_baru->beli_komputer(); echo "<br />"; echo $laptop_baru->lihat_spec(); ?>
Dalam contoh kode ini terdapat class komputer dengan beberapa property dan sebuah method. Semua property milik class komputer masih belum berisi nilai apa-apa.
Di bawah class komputer, saya membuat class laptop extends class komputer. Disini terjadi penurunan class komputer kepada class laptop. Hasilnya, di dalam class laptop kita bisa mengakses seluruh property dan method apapun milik class komputer selama memiliki hak akses public atau protected.
Untuk membuktikan hal tersebut, saya membuat objek $laptop_baru dari class laptop. Perhatikan bahwa kita bisa mengakses property $merk, $processor, dan$memory yang semuanya adalah milik class komputer, bukan class laptop.
Method beli_komputer() juga sukses diakses dari objek $laptop baru. Inilah yang dimaksud dengan inheritance/penurunan class dalam OOP.
PHP tidak membatasi berapa banyak penurunan objek yang bisa dilakukan. Dalam contoh berikut saya membuat 3 buah class yang saling diturunkan:
<?php // buat class komputer class komputer { Â Â protected function beli_komputer() { Â Â Â Â return "Beli komputer baru"; Â Â } } Â // turunkan class komputer ke laptop class laptop extends komputer { Â Â protected function beli_laptop() { Â Â Â Â return "Beli laptop baru"; Â Â } } Â // turunkan class laptop ke chromebook class chromebook extends laptop { Â Â protected function beli_chromebook() { Â Â Â Â return "Beli chromebook baru"; Â Â } Â Â Â public function beli_semua(){ Â Â Â Â $a = $this->beli_komputer(); Â Â Â Â $b = $this->beli_laptop();Â Â Â Â Â Â Â Â $c = $this->beli_chromebook(); Â Â Â Â return "$a <br /> $b <br /> $c"; Â Â } } Â // buat objek dari class laptop (instansiasi) $gadget_baru = new chromebook(); Â //panggil method objek echo $gadget_baru->beli_semua(); Â // $gadget_baru->beli_komputer(); // Fatal error: Call to protected method komputer::beli_komputer() ?>
Di awal kode program saya membuat class komputer yang diturunkan kepada class laptop. Class laptop ini kemudian diturunkan lagi kepada class chromebook. Dari dalam class chromebook ini di panggil method-model milik class diatasnya.
Jika anda perhatikan, setiap method selain method beli_semua(), juga menggunakan hak akses protected. Hak akses protected ini menghalangi kode program lain untuk mengaksesnya, selain class turunan.
Pada baris terakhir saya menyisipkan kode program untuk mencoba mengakses method beli_komputer(). Kode ini sengaja diberi tanda komentar karena PHP akan mengeluarkan error karena kita tidak bisa mengakses method dengan hak akses protected:
<? $gadget_baru->beli_komputer(); // Fatal error: Call to protected method komputer::beli_komputer() ?>
Inilah salah satu penerapan enkapsulasi dalam OOP PHP. Yakni membatasi method yang tidak boleh diakses akan membuat kode program menjadi lebih terstruktur.
Dalam tutorial belajar OOP PHP kali ini, kita telah pelajari konsep inheritance atau pewarisan dalam pemrograman objek.
Penurunan class memiliki permasalahan tersendiri ketika terdapat property atau method dengan nama yang sama di parent class dan child class. Mengenai hal ini akan kita bahas dalam tutorial belajar OOP PHP berikutnya: Cara Mengakses Property dan Method Parent Class.
Saya coba contoh yang terakhir ternyata tidak error, hasilnya :
"Beli komputer baru
Beli laptop baru
Beli chromebook baru"
Gimana ini ya?
bukannya harusnya tidak error? kan class komputer di protected tetapi di akses oleh class chrome yang merupakan publik?
Betul gan, kode tersebut tidak akan menghasilkan error, karena method $gadget_baru->beli_semua() adalah public.
Kode program yang saya maksud akan menghasilkan error memang sengaja saya buat sebagai komentar:
Jika komentar dihapus, baru akan terjadi error:
Mungkin penjelasannya agak kurang jelas, dan akan saya perbaiki.
Terimakasih koreksinya gan :)
Jadi maksudnya, kalo objek $gadget_baru melakukan pemanggilan terhadap method beli_komputer() secara langsung baru errornya muncul, tapi kalo melalui method beli_semua() tidak terjadi error karena merupakan child class dari class sebelum-sebelumnya, gitu bukan bang ?
portal informasi yang isi nya sangat praktis penyajian nya.kalo bisa untuk di terbitkan menjadi buku tuh
Terimakasih mas… Iya, saya ada rencana kesana… masih menimbang2 apakah menjadikan ebook atau dibuat menjadi buku fisik :)
penjelasan yang cukup membuat saya paham,,, lanjutkan min….
cara penyampaian lewat tulisan yang sangat pas!!
sudah banyak buku & blog saya baca, namun susah untuk mencapai kata *ngeh (ngerti), tapi di blog ini saya mendapatkan penjelasan yang mudah dimengerti.
smoga yang punya blog makin banyak share nya, dan slalu dbuat terkonsep seperti yang sudah ada.
Terima kasih banyak mas Admin, ijin ubek-ubek blog nya :)
Silahkan gan,.. :) saya juga senang tutorialnya bisa mudah dipahami.
Penjelasan yang menarik mas, terima kasih atas pencerahan ilmunya :)
maaf mas butuh pencerahan,, saya bingung pada return "Beli komputer baru"; kenapa tidak echo "Beli komputer baru"; kenapa tidak echo saja. bedanya dmn nya mas,, saya muter2 blm nemu, tolong jabarkan mas,, tolong
intinya kenapa
return "Beli komputer baru";
bukanyaecho "Beli komputer baru";
Kalau menggunakan konsep OOP yang baik dan benar, memang menggunakan return mas. Karena method itu adalah function, dan seharusnya sebuah function memang mengembalikan nilai (menggunakan keyword return).
Dalam contoh OOP sebelum ini saya memang banyak menggunakan echo agar lebih singkat dan mudah untuk dipahami. Pembahasan lebih lanjut mengenai return ini bisa melihat tutorial tentang function PHP, bisa ke Pengertian Fungsi (function) PHP dan Cara Penulisan dan Pembuatan Fungsi PHP
terimakasih mas,, cukup saya fahami penjelasan mas,, mengenai link tutor yng mas lampirkan maaf saya blm baca karena pada web ini saya blm temukan mas,,soalnya pada categori
Tutorial OOP PHP terlihat hanya sampai part 17 mas,, terimakasih mas :)
Sama2 mas, semoga tutorialnya bisa dipahami dengan mudah :)
Artikelnya mudah dipahami, thanks, keep posting. :D
Mau nanya nih gan,
Disini ada tutorial yang lebih mengarah menengah ke atas engga,
Soal php,
Seperti pembahasan masalah yang lebih kompleks,
Contoh kecil preg_replace('#/[^/]*$#i'),
Ni jarang dibahas gan ditutorial yang sering aku temuin, kan untuk newbie seperti aku jadi bingung apa arti dr contoh kecil diatas?
Bahasa apalagi ya gan untuk mengimbangi bahasa PHP ?
Haruskah mempelajari algoritma/ bahasa mesin langsung?
Apa hanya kita kembangkan sendiri dr bahasa PHP dasar yaahhh?
Mohon bantuannya gan, semoga tuhan membalas kebaikan agan, siap beli ebook/bukunya kalau ada yang merujuk kemenengah keatas gan . .
Untuk tutorial PHP lanjutan belum ada gan, saat ini saya sedang menyelesaikan eBook PHP dasar, tapi belum mencakup tentang OOP. Fungsi regular expression seperti preg_replace() mungkin akan dibahas di eBook PHP dasar (materinya belum saya buat).
Saya rencanakan nanti ada eBook khusus PHP lanjutan yang akan membahas OOP hingga design pattern-nya. Tapi kayaknya belum dalam waktu dekat.
Wah, g usah sampe bahasa mesin gan, kecuali ingin belajar buat robot, hehe…
Kalau agan sudah paham tentang PHP dasar, saran saya lanjut saja ke Framework PHP seperti Code Igniter atau Laravel.
Terima kasih sebelumnya gan,
Udah kasih pencerahan,
Ini juga sudah mulai mempelajari framework ci,
Dan ditunggu ebooknya,
Semoga diberi kita diberi umur panjang,
Biar situ bisa ngelarin ebooknya,
Saya bisa beli ebooknya,
Hehehe
Amiin gan… Siipp, terimakasih juga untuk dukungannya :)
Jika ada kode program seperti ini yang diambil dari contoh susunan class terakhir
1. $gadget_baru = new komputer();
2. echo $gadget_baru -> beli_semua();
3.
4. $gadget_baru = new laptop();
5. echo gadget_baru -> beli_semua();
apa baris kedua dan kelima bisa dijalankan ? berhubung method beli_semua itu public
G bisa gan, karena method beli_semua() baru di defenisikan di dalam class chromebook(). Method beli_semua() ini tidak ada di dalam parent classnya (class komputer dan laptop).
Satu lagi Pak hehe
Pertanyaan :
1. Bukankah class chromebook merupakan turunan "tidak langsung" dari class komputer ? kenapa tidak bisa mengakses method beli_komputer ?
2. Apa yang disebut turunan hanyalah yang "langsung" dimana terdapat kata extends yang mengarah langsung ke induk ?
3. Jika pertanyaan kedua saya benar, berarti
$gadget_baru -> beli_komputer();
baru bisa dijalankan ketika penulisan kodenya seperti ini saat pembuatan class
class chromebook extends laptop { … }
iya ga Pak ? mumet hehe
EDIT
class chromebook extends komputer { … }
1. Karena method beli_komputer() di set sebagai protected. Lain ceritanya kalau di set sebagai public.
2. Iya gan, bisa dibilang bahwa "ibu" dan "anak" adalah turunan langsung, sedangkan "nenek" bukan turunan langsung dari "anak". Dalam contoh diatas, class komputer adalah "nenek" dari class chromebook, jadi bukan turunan langsung.
3. Pembatasan diatas karena hak akses protected gan, karena itu hanya bisa diakses oleh turunan langsung. Jadi iya, bisa seperti itu.
Tanya lagi dong Pak :(
<?php
// buat class induk: komputer
class komputer {
public $merk;
public $processor;
public $memory;
public function beli_komputer() {
return "Beli komputer baru";
}
}
class laptop {
public function lihat_spec() {
return "merk: $this->merk, processor: $this->processor,
memory: $this->memory";
}
}
// buat objek dari class laptop (instansiasi)
$laptop_baru = new laptop();
?>
Jika class laptop bukanlah turunan dari komputer, apakah benar kode dibawah tetap bisa dijalankan ?
berhubung property dan method pada class komputer bersifat public, jadi walaupun class laptop bukan turunan pun juga dapat mengaksesnya
// isi property objek
$laptop_baru->merk = "acer";
$laptop_baru->processor ="intel core i5";
$laptop_baru->memory = "2 GB";
//panggil method objek
echo $laptop_baru->beli_komputer();
echo "<br />";
echo $laptop_baru->lihat_spec();
Kalau seperti ini akan jadi error gan, terutama dibagian ini: $this->merk pada class laptop.
Perintah $this->merk artinya kita ingin mengakses properti $merk dari kelas saat ini. Sedangkan di dalam class laptop tidak ada properti/variabel $merk. Variabel ini hanya ada di dalam class komputer yang tidak ada hubungannya.
Kecuali kita mengubah $this->merk menjadi komputer::$merk. Ini baru bisa jalan, tapi kita sudah menggunakan fitur lain lagi: static property (saya bahas di tutorial lainnya).
kalo mau extends class A dengan class B, tapi masing masing class ada di file yg berbeda itu bisa nggk ya?
Bisa saja.. tapi file PHP class yang mau di extends harus di include dulu.
pak andre apakah intinya inheritance, apakah super class menurunkan member superclass kepada sub class ?
Saya ingin bertanya perbedaan yang benar-benar jelas dari inheritance dan enkapsulasi itu apa ya pak,
1. Dari sisi hak akses baik inheritance maupun enkapsulasi memiliki sama" 3 hak akses public, protected
dan private
2. Dari sisi penggunaan saya perhatikan, jika inheritance pasti mengguankan extends untuk menurunkan
kelas , tetapi di sisi enkapsulasi juga bisa menggunakan extends
jadi apa sih yang benar" membedakannya, tolong penjelasannya masih binggung pak, terima kasih
Enkapsulasi hanya berhubungan dengan hak akses, yakni public, protected dan private. Terserah apakah class tersebut mau diturunkan atau tidak.
Sedangkan inheritance hanya berurusan dengan penurunan class menggunakan extends, tidak peduli apakah class itu public, protected atau private.
Namun kalau dilihat dari kodenya, keduanya memang sering digunakan bersama2. Sama seperti pemisahan antara kode HTML, CSS dan PHP. Dalam 1 halaman web, ketiganya sering digunakan secara bersamaan.
terimakasih pak, telah berbagi tutorial ini ,
dan juga saya mau bertanya mksud penulisan titik 2 pada script di bawah apa ya pak , apa ada link penjelasan lebih lengkap makasih pak…
return "merk: $this->merk, processor: $this->processor,
memory: $this->memory";
: itu string biasa, jadi kalau dipanggil method nya (function lihat_spec), maka hasilnya adalah
merk: Acer, processor: intel core i5, memory: 2GB
min, kalo mau manggil class lain di folder lain gmn ya,
misal "class laptop extends komputer" tp class computernya di folder yang berbeda gmn cara manggilnya
Kalau classnya ada di file lain, maka harus di import dulu ke dalam file saat ini, caranya bisa menggunakan fungsi include() atau require() bawaan PHP.
Terimakasih min, ini sangat berguna dan mudah dipahami