Senin, 21 Desember 2015

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
<b>Fatal error</b>: 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 ‘::’.