Melanjutkan tutorial OOP PHP mengenai Inheritance, kali ini kita akan mempelajari cara mengakses property dan method dari parent class, serta pengertian Scope Resolution Operator.
Cara Mengakses Property dan Method Parent Class
Konsep pewarisan/inheritance dimana sebuah class bisa memiliki property dan method dari class lain, bisa menjadi permasalahan ketika property atau method dari class anak memiliki nama yang sama dengan class induk, atau dikenal dengan istilah overridden property dan overridden method.
Untuk memahami pengertian overridden property dan overridden method, perhatikan contoh kode program berikut ini:
<?php // buat class komputer class komputer { Â Â Â public function lihat_spec() { Â Â Â Â return "Spec Komputer: Acer, Â Â Â Processor Intel core i7, Ram 4GB"; Â Â } } Â // turunkan class komputer ke laptop class laptop extends komputer { Â Â Â public function lihat_spec() { Â Â Â Â return "Spec Laptop: Asus, Â Â Â Processor Intel core i5, Ram 2GB"; Â Â } } // buat objek dari class laptop (instansiasi) $gadget_baru = new laptop(); Â //panggil method lihat_spec() echo $gadget_baru->lihat_spec(); ?>
Pada kode program diatas, saya membuat 2 buah class: komputer dan laptop. Saya menurunkan class komputer kedalam class laptop, sehingga seluruh property dan method dari class komputer bisa diakses dari class laptop.
Namun perhatikan bahwa method pada class komputer memiliki nama yang sama dengan method dalam class laptop. Ketika kita memanggil method lihat_spec(), method manakah yang akan dijalankan?
Jika anda menjalankan kode diatas, maka hasilnya adalah:
Spec Laptop: Asus, Processor Intel core i5, Ram 2GB
Berdasarkan hasil yang di dapat, terlihat bahwa method yang dijalankan adalah method milik class laptop.
Di dalam PHP, ketika nama property atau nama method child class memiliki nama yang sama dengan parent class, maka yang dijalankan adalah property atau method milik child class.
Jadi, bagaimana cara mengakses property dan method milik class komputer? PHP mengatasi hal ini dengan menggunakan 'Scope Resolution Operator'.
Pengertian Scope Resolution Operator PHP
Scope Resolution Operator adalah operator khusus di dalam PHP yang memungkinkan kita untuk mengakses 'informasi khusus' dari dalam class.
Informasi khusus ini terdiri dari: overridden property atau overridden method, static property atau static method, serta constanta class. Untuk saat ini, kita akan fokus kepada overridden property atau overridden method. Mengenai static property, static method, dan konstanta class akan kita bahas dalam tutorial lainnya.
Scope Resolution Operator ditulis dengan tanda dua kali titik dua (double colon), yakni "::". Untuk mengakses property dan method dari class induk, kita mengaksesnya dengan perintah:
parent::nama_property; parent::nama_method();
Kembali kepada contoh program, kali ini kita ingin menampilkan method lihat_spec() dari class komputer:
<?php // buat class komputer class komputer { Â Â Â public function lihat_spec() { Â Â Â Â return "Spec Komputer: Acer, Â Â Â Processor Intel core i7, Ram 4GB"; Â Â } } Â // turunkan class komputer ke laptop class laptop extends komputer { Â Â Â public function lihat_spec() { Â Â Â Â return "Spec Laptop: Asus, Â Â Â Processor Intel core i5, Ram 2GB"; Â Â } Â Â Â Â public function lihat_spec_komputer() { Â Â Â Â return parent::lihat_spec(); Â Â } } // buat objek dari class laptop (instansiasi) $gadget_baru = new laptop(); Â //panggil method lihat_spec() echo $gadget_baru->lihat_spec(); echo "<br />"; //panggil method lihat_spec_komputer() echo $gadget_baru->lihat_spec_komputer(); ?>
Kode program diatas adalah revisi dari contoh kita sebelumnya. Saya menambahkan sebuah method lihat_spec_komputer() kedalam class laptop. Method ini selanjutkan akan memanggil method class komputer, dengan perintah parent::lihat_spec().
Hasilnya adalah:
Spec Laptop: Asus, Processor Intel core i5, Ram 2GB Spec Komputer: Acer, Processor Intel core i7, Ram 4GB
Contoh diatas adalah cara mengakses method parent class dari child class. Lalu bagaimana dengan cara mengakses parent property dari child class? Jika anda berfikir sama seperti saya, maka kita bisa tebak bahwa caranya adalah menggunakan parent::nama_property, apakah bisa? mari kita coba:
<?php // buat class komputer class komputer { Â Â Â public $merk = "acer"; Â Â Â public function lihat_spec() { Â Â Â Â return "Spec Komputer: Acer, Â Â Â Processor Intel core i7, Ram 4GB"; Â Â } } Â // turunkan class komputer ke laptop class laptop extends komputer { Â Â public $merk = "asus"; Â Â Â public function lihat_spec() { Â Â Â Â return "Spec Laptop: Asus, Â Â Â Processor Intel core i5, Ram 2GB"; Â Â } Â Â Â Â public function lihat_spec_komputer() { Â Â Â Â return parent::lihat_spec(); Â Â } Â Â public function lihat_merk_komputer() { Â Â Â Â return parent::$merk; Â Â } } // buat objek dari class laptop (instansiasi) $gadget_baru = new laptop(); Â //panggil method lihat_spec() echo $gadget_baru->lihat_spec(); echo "<br />"; //panggil method lihat_spec_komputer() echo $gadget_baru->lihat_spec_komputer(); //panggil method lihat_merk_komputer() echo $gadget_baru->lihat_merk_komputer(); ?>
Dalam kode program diatas, saya menambahkan sebuah method baru: lihat_merk_komputer() yang akan menjalankan perintah return parent::$merk. Jika kita menjalankan program diatas, hasilnya adalah:
Spec Laptop: Asus, Processor Intel core i5, Ram 2GB Spec Komputer: Acer, Processor Intel core i7, Ram 4GB Fatal error: Access to undeclared static property: komputer::$merk
Apa yang terjadi?
Error diatas juga membuat saya bingung saat pertama kali mencobanya. Kode error diatas berarti kita mencoba mengakses property static $merk dari class komputer, bukan property public $merk dari class komputer sebagaimana kode error (Property static tidak sama dengan property biasa, kita akan mempelajarinya sesaat lagi di: Pengertian static property dan static method).
Pengertian static property belum kita pelajari sampai tutorial kali ini, dan akan saya bahas lengkap pada tutorial tersendiri. Namun berdasarkan kode error tersebut dan membaca beberapa sumber, saya mendapati bahwa kita tidak bisa mengakses property parent class secara langsung.
Jadi, bagaimana caranya?
Yang perlu menjadi perhatian disini adalah bahwa kode kita disini memiliki nama method dan property yang sama baik di child class dan juga pada parent class. Solusi yang paling mudah adalah: tidak menggunakan nama property dan method yang sama. Dengan demikian, kode program akan menjadi lebih jelas dan lebih mudah untuk dipahami.
Dalam tutorial kali ini, kita telah mempelajari cara mengakses property dan method parent class dengan Scope Resolution Operator, atau tanda '::'.
Dalam tutorial selanjutnya, masih berkaitan dengan inheritance, kita akan mempelajari efek penurunan ini kedalam constructor dan destructor. Kita akan mempelajari cara mengakses constructor dan destructor parent class.
mas kok outputnya tetap puna class laptop bukann class komputer,,pie to mas,, apa aku yang salah mengartikannya ?
minta penjelasannya masss
Maaf gan, setelah saya baca ulang, memang terdapat kesalahan dari penggunaan $this di parent class. Variabel $this ini ternyata tetap merujuk kedalam child class, bukan parent-nya. Saya sudah tulis ulang kode program yang ada untuk hal ini. Terimakasih atas koreksinya gan…
Gan mau tanya, perbedaan kode :: dengan -> apa ya, apa ada perbedaan di antara kedua nya ? Mohon pencerahannya ya hehe
gan, kira2 rencana buat tutorial php framework ga ?
Ada gan, tapi mungkin belum dalam waktu dekat :)
ayo gan buat tutorialnya kalo bisa CI
Mas, jadi kalau child class mau manggil property static parent class gimana ? dicontoh hanya dijelasin pemanggilan method parent dari child class nya saja.
tinggal panggil parent::$nama_property;
Kalau kita ingin memanggil property milik parent dari child class bisa langsung diakses dengan $this->nama_properti kan yah selama bukan private scoopenya dan belum belum dioverride sama child class