Setelah memahami cara membuat dan mengakses objek dalam PHP, dalam tutorial kali ini kita akan membahas salah satu aspek terpenting dalam Pemrograman Berbasis Objek (OOP), yakni Enkapsulasi (bahasa inggris: Encapsulation). Proses enkapsulasi diterapkan dengan menggunakan 3 jenis hak akses: Public, Protected dan Private.
Kita akan mempelajari Pengertian Enkapsulasi (Public, Protected dan Private) dalam PHP.
Pengertian Enkapsulasi (Encapsulation)
Enkapsulasi (encapsulation) adalah sebuah metoda untuk mengatur struktur class dengan cara menyembunyikan alur kerja dari class tersebut.
Struktur class yang dimaksud adalah property dan method. Dengan enkapsulasi, kita bisa membuat pembatasan akses kepada property dan method, sehingga hanya property dan method tertentu saja yang bisa diakses dari luar class. Enkapsulasi juga dikenal dengan istilah ‘information hiding’.
Dengan enkapsulasi, kita bisa memilih property dan method apa saja yang boleh diakses, dan mana yang tidak boleh diakses. Dengan menghalangi kode program lain untuk mengubah property tertentu, class menjadi lebih terintegrasi, dan menghindari kesalahan ketika seseorang ‘mencoba’ mengubahnya. Programmer yang merancang class bisa menyediakan property dan method khusus yang memang ditujukan untuk diakses dari luar.
Melanjutkan analogi tentang class laptop, perusahaan pembuat laptop telah menyediakan ‘method’ khusus untuk menghidupkan laptop, yakni dengan cara menekan tombol on. Di dalam laptop sendiri, banyak ‘method-method’ lain yang akan dijalankan ketika kita menyalakan laptop, contohnya: mengirim sinyal booting ke processor, mengirim data dari processor ke memory, dan mengirim sinyal listrik ke LED di monitor. Akan tetapi, proses ini adalah method internal laptop dimana kita tidak perlu memahaminya untuk menghidupkan laptop.
Enkapsulasi Objek: Public, Protected dan Private
Untuk membatasi hak akses kepada property dan method di dalam sebuah class, Objek Oriented Programming menyediakan 3 kata kunci, yakni Public, Protected dan Private. Kata kunci ini diletakkan sebelum nama property atau sebelum nama method. Berikut adalah pembahasannya:
Pengertian Hak Akses: Public
Ketika sebuah property atau method dinyatakan sebagai public, maka seluruh kode program di luar class bisa mengaksesnya, termasuk class turunan. Berikut adalah contoh penulisan public property dan public method dalam PHP:
<?php // buat class laptop class laptop { // buat public property   public $pemilik; // buat public method   public function hidupkan_laptop() {   return "Hidupkan Laptop";   } }  // buat objek dari class laptop (instansiasi) $laptop_anto = new laptop();  // set property $laptop_anto->pemilik="Anto";  // tampilkan property echo $laptop_anto->pemilik; // Anto  // tampilkan method echo $laptop_anto->hidupkan_laptop(); // "Hidupkan Laptop" ?>
Perhatikan penambahan kata public sebelum nama property dan nama method. Kode di atas pada dasarnya sama dengan contoh class laptop kita dalam tutorial sebelum ini.
Jika hak akses property dan method tidak ditulis, maka PHP menganggapnya sebagai public.
var $pemilik;
Kata kunci var sebenarnya tidak perlu ditulis, bahkan pada PHP versi 5.0 sampai dengan 5.1.3, menggunakan kata var di dalam class akan menghasilkan warning. Untuk PHP versi 5.1.3 ke atas, menggunakan kata var tidak lagi menghasilkan warning (dianggap sebagai public).
Agar sejalan dengan konsep enkapsulasi, setiap property dan method dalam class harus menggunakan kata kunci seperti public, protected, atau private. Oleh karena itu, membuat property dengan keyword var tidak disarankan lagi .
Pengertian Hak Akses: Protected
Jika sebuah property atau method dinyatakan sebagai protected, berarti property atau method tersebut tidak bisa diakses dari luar class, namun bisa diakses oleh class itu sendiri atau turunan class tersebut.
Apabila kita mencoba mengakses protected property atau protected method dari luar class, akan menghasilkan error, seperti contoh berikut ini:
<?php // buat class laptop class laptop { // buat protected property   protected $pemilik; // buat protected method   protected function hidupkan_laptop() {   return "Hidupkan Laptop";   } } // buat objek dari class laptop (instansiasi) $laptop_anto = new laptop();  // set protected property akan menghasilkan error $laptop_anto->pemilik="Anto"; // Fatal error: Cannot access protected property laptop::$pemilik  // tampilkan protected property akan menghasilkan error echo $laptop_anto->pemilik; // Fatal error: Cannot access protected property laptop::$pemilik  // jalankan protected method akan menghasilkan error echo $laptop_anto->hidupkan_laptop(); // Fatal error: Call to protected method laptop::hidupkan_laptop() // from context ?>
Dalam contoh di atas, pemanggilan property $pemilik dan method hidupkan_laptop() dari luar class akan menghasilkan error.
Walaupun akses level protected tidak bisa diakses dari luar class, namun bisa diakses dari dalam class itu sendiri, berikut adalah contohnya:
<?php // buat class laptop class laptop { // buat protected property   protected $pemilik="Anto";   public function akses_pemilik() {   return $this->pemilik;   }   protected function hidupkan_laptop() {    return "Hidupkan Laptop";   }   public function paksa_hidup() {   return $this->hidupkan_laptop();   } }  // buat objek dari class laptop (instansiasi) $laptop_anto = new laptop();  // jalankan method akses_pemilik() echo $laptop_anto->akses_pemilik(); // "Anto"  // jalankan method paksa_hidup() echo $laptop_anto->paksa_hidup(); // "Hidupkan Laptop" ?>
Hampir sama dengan contoh kita sebelumnya, property $pemilik di deklarasikan sebagai protected, sehingga pengaksesan dari luar class akan menghasilkan error. Oleh karena itu, saya membuat sebuah public method yang akan menampilkan hasil property $pemilik, yakni method akses_pemilik().
Begitu juga dengan method hidupkan_laptop() yang tidak bisa diakses secara langsung. Saya menambahkan method paksa_hidup() yang secara internal akan mengakses method hidupkan_laptop().
Selain dari dalam class itu sendiri, property dan method dengan hak akses protected juga bisa diakses dari class turunan (Kita akan membahas tentang penurunan class dalam tutorial lain):
<?php // buat class komputer class komputer{ // property dengan hak akses protected protected $jenis_processor = "Intel Core i7-4790 3.6Ghz"; } Â // buat class laptop class laptop extends komputer{ Â Â public function tampilkan_processor() { return $this->jenis_processor; Â Â } } Â // buat objek dari class laptop (instansiasi) $laptop_baru = new laptop(); Â // jalankan method echo $laptop_baru->tampilkan_processor(); // "Intel Core i7-4790 3.6Ghz" ?>
Pada kode di atas, walaupun method $jenis_processor di set sebagai protected pada class komputer, tetapi masih bisa diakses dari class laptop yang merupakan turunan dari class komputer.
Pengertian Hak Akses: Private
Hak akses terakhir dalam konsep enkapsulasi adalah private. Jika sebuah property atau method di-set sebagai private, maka satu-satunya yang bisa mengakses adalah class itu sendiri. Class lain tidak bisa mengaksesnya, termasuk class turunan.
Sebagai contoh, berikut adalah hasil yang di dapat jika kita mengakses property dan method dengan level private:
<?php // buat class komputer class komputer { // property dengan hak akses protected private $jenis_processor = "Intel Core i7-4790 3.6Ghz"; Â Â Â Â public function tampilkan_processor() { return $this->jenis_processor; Â Â } } Â // buat class laptop class laptop extends komputer{ Â Â Â public function tampilkan_processor() { return $this->jenis_processor; Â Â } } Â // buat objek dari class laptop (instansiasi) $komputer_baru = new komputer(); $laptop_baru = new laptop(); Â // jalankan method dari class komputer echo $komputer_baru->tampilkan_processor(); // "Intel Core i7-4790 3.6Ghz" Â // jalankan method dari class laptop (error) echo $laptop_baru->tampilkan_processor(); // Notice: Undefined property: laptop::$jenis_processor ?>
Dalam kode di atas, saya membuat 2 buah class, yakni class komputer, dan class laptop. Class laptop merupakan turunan dari class komputer. Di dalam class komputer terdapat property $jenis_processor dengan akses level private. Di dalam class komputer dan class laptop, saya membuat method tampilkan_processor() yang digunakan untuk mengakses property $jenis_processor.
Pengaksesan method tampilkan_processor() dari objek $komputer_baru sukse ditampilkan karena berada di dalam satu class dimana property $jenis_processor berada.
Akan tetapi, jika method tampilkan_processor() diakses dari objek $laptop_baru yang merupakan turunan dari class komputer, PHP akan mengeluarkan error karena property $jenis_processor tidak dikenal.
Akses level private sering digunakan untuk menyembunyikan property dan method agar tidak bisa diakses di luar class.
Dalam tutorial kali ini, kita telah membahas tentang pengertian enkapsulasi dalam objek oriented programming (OOP), mengenal 3 hak akses: public, protected, dan private, serta melihat contoh cara penggunaannya di dalam PHP.
Dalam tutorial belajar OOP PHP berikutnya, kita akan membahas tentang pengertian dan fungsi variabel $this dalam PHP.
Harus saya akui kalimat dan contoh yang digunakan sangat sederhana sehingga sangat mudah dimengerti. Terima kasih duniailkom, sangat bermanfaat !
Saya sudah paham cara kerja ketiga hak akses tersebut. Namun bisakah diberi contoh penggunaan masing masing hak akses yang hubungannya dengan kasus dunia nyata? Misalnya dengan kasus perancangan web login?
Oh, ditunggu saja tutorial lanjutannya y gan.. Mudah2an nanti saya buatkan kasus ‘real world’nya.. terimakasih atas komentarnya :)
Mungkin Kang Admin bisa membahas korelasi antara penggunaan masing masing hak akses dengan contoh kasus dunia nyata, seperti yang disebutkan dalam artikelnya:
Kapan kita memutuskan suatu property dan method diberi hak akses Public?
Kapan kita memutuskan suatu property dan method diberi hak akses Protected?
Kapan kita memutuskan suatu property dan method diberi hak akses Private?
mungkin bsa diberikan contoh pada kasus perancangan web login misalnya?
Semoga Kang Admin tidak bosan dengan pertanyaan saya yg sangat banyak. karena saya juga pengen belajar lebih banyak lagi. :D
Konsep OOP lebih banyak digunakan untuk membuat library PHP, yakni kode program yang akan digunakan oleh orang lain. Dengan demikian hak akses private, protected dan public akan lebih ‘terpakai’.
Sebagai contoh, misalkan saya ingin membuat sebuah library validasi sederhana, berikut adalah kerangka class yang digunakan:
Class validasi diatas saya buat untuk memudahkan orang lain mengecek apakah sebuah variabel berisi angka (menggunakan method is_number), apakah berisi huruf alfabet (menggunakan method is_alfabet), atau angka dan alfabet (menggunakan method is_alfanumerik).
Karena ketiga method ini adalah metoda untuk menggunakan fitur class, maka ketiganya saya buat sebagai public. Akan tetapi method is_null() saya gunakan hanya di dalam class, bukan untuk diakses oleh pengguna library, oleh karena itu saya set sebagai private. Begitu juga dengan variabel container dan container2 yang hanya untuk kepentingan internal saja.
Umumnya, variabel dalam sebuah class akan di set sebagai private. Untuk mengakses variabel ini biasanya dibuatkan sebuah method khusus (dikenal sebagai setter dan getter).
Jika ingin melihat penggunaan yang benar2 ‘real world’, bisa melihat source code dari berbagai library PHP yang ada di internet. Namun cari library yang relatif sederhana agar mudah dipelajari. Sebagai contoh, bisa coba lihat Valitron. Ini adalah library PHP untuk proses validasi form. Silahkan lihat2 cara penggunaan metode aksesnya.
Pertanyaan ente sungguh lucu.. coba aja ente bikin project dari nol.. ntar ketemu deh hal2 yg kita pelajari dri dasar kaya gini ntr kepake :v swer…
Saya agak tergerak sedikit untuk memberikan komen terhadap tanggapan ente yang 'lucu' yang notabenenya mungkin sudah adpanced.
Ada 2 tipe orang di dunia ini:
1. Yang belajar teori baru dipraktikkan.
2. Yang belajar dari praktik atau kalimat kerennya learning by doing.
Tapi tidak sedikit orang juga yang sudah menjalankan tipe kedua itu bisa langsung mengerti tanpa bertanya kepada yang sudah memang memahami kapan penggunaannya.
Fungsi kolom komentar disediakan tidak lain salah satunya adalah untuk memberikan pertanyaan, besar harapan saya kedepannya supaya ente bisa ketawa sendiri tanpa harus membuang waktu hanya demi mencela pertanyaan yang ente anggap 'lucu'. Cobalah dewasa seperti mereka yang di SOF.
Kita sama-sama belajar. Jadi kalau ada pertanyaan yang agak 'lucu', jangan dicela, tapi berikan jawabannya ya.
enak dibacanya mudah dimengerti om, thanks!
min jika properti yang di proteksi ada beberapa macam gimana cara akses nya ?
contoh
class hp {
protected $merk = “Iphone 6”;
protected $harga = “RP 12.000.000″;
}
apabila menggunakan class turunan apakah setiap properti harus mempunyai class sendiri”?
btw thanks for the education !!!
Karena di set dengan hak akses protected, maka satu-satunya cara untuk mengakses properti itu hanya dari class itu sendiri atau turunannya gan…
Yup, benar. Di dalam konsep OOP, setiap property harus berada di dalam sebuah class..
ada class di dalam class :)
Maksudnya perintah 'extends' y gan? sebenarnya ini bukan class di dalam class, tapi turunan class. Memang terlihat seperti class di dalam class, tapi konsepnya beda.
keren min, gampang di pahami.., cocok untuk pelajar kayak saya..,
Lanjut gan… :)
class komputer{
public $merk;
public $harga;
function power_on(){
return "hidupkan device";
}
function power_off(){
return "matikan device";
}
}
class laptop extends komputer{
function lihat_spek(){
return "merk : $this->merk <br /> harga : $this->harga";
}
}
class hp {
function ambil_merk(){
return "merk : $this->merk";
}
}
$laptop_gaming = new laptop();
$laptop_gaming->merk = "samsung";
$laptop_gaming->harga = 500000;
echo $laptop_gaming->lihat_spek();
echo "<br />";
$hp_anyar = new hp();
echo $hp_anyar->ambil_merk();
fungsi ambil merk kok gk bisa nampilin nilai dari property class komputer ya bang
kan sudah dibuat public ?
Agar sebuah method bisa dipanggil dari dalam class, harus diturunkan dulu gan, misalnya di class laptop menggunakan perintah "extends komputer".
Tp logika programnya banyak yang masih salah gan, mungkin bisa dipelajari lagi tutorial OOP PHP nya dari awal kembali :)
iyaa bang makasih koreksi nya
untuk logika program yg salah bisa dikasih tau bang ? :D
Itu class hp nya berdiri sendiri soalnya gan.. jadi mungkin ga bisa ngakses property dari class komputer-nya (bahasa awamnya, si class komputer dan class hp ga berhubungan)… kecuali kalo class hp nya agan jadiin child class / turunan dari class komputer dengan menambahkan keyword 'extends' di class hp nya:
class hp extends komputer {
// isi disini
}
atau kalau memang class hp nya mau berdiri sendiri, agan bisa nambahin property baru di dalam class nya, jadi gini:
class hp {
public $merk;
function ambil_merk(){
return "merk : $this->merk";
}
cmiiw…
Buku yang jadi referensi AP AZ kalo boleh tau
Untuk tutorial OOP PHP ini saya ambil langsung dari manual resmi PHP gan, bisa di lihat di http://php.net/manual/en/language.oop5.php
Pengertian enkapsulasi dalam objek oriented programming (OOP), mengenal 3 hak akses: public, protected, dan private.
Dari tutorial tersebut saya menyimpulkan:
Public: dapat diakses diluar class (sebuah object dr class tsb), turunan class (class dari turunan class tsb), didalam class (didalam class itu sendiri).
Protected: dapat diakses pada turunan class (class dari turunan class tsb), didalam class (didalam class itu sendiri).
Private: Hanya bisa diakses didalam class itu sendiri.
Apakah kesimpulan saya sudah tepat? Mohon koreksinya mas admin :)
Yup, sudah benar gan. Pengertiannya seperti itu :)
apakah pengaksesan protected bisa untuk class turunan dari clas turunannya tersebut?
Dicoba saja gan, sepertinya bisa…
Thanks gan…Tulisannya gampang dimengerti bahkan untuk pemula seperti saya sekalipun.
Bagus untuk jadi referensi
udah lama gak ke duniaillkom lagi.. gara gara ada perintah harus bisa minimal satu framework yaitu Codeigniter.. . eh rupanya igniter pakai konsep OOP. search di google php OOP alhamdulillah. sampai nya di sekolah aku yang dulu yaitu duniailkom.. karena udah pernah belajar java .. alhamdulillah.. konsep nya rupanya sama kayak java.. makasi mas..
Hehe siip, konsep OOP memang mirip2. Cukup dipahami di 1 bahasa saja (seperti Java), untuk bahasa lain akan mengikuti dan hanya beda di cara penulisan saja.
saya belajar java OOP.
tapi konsepnya saya belajar dari php Dari duniaiklom
soalnya bahasanya / istilahnya mudah di pahami
thanks mas
Bang ane mau nanya ttg hak akses private
Kalau yang abg tulis kan begini:
<?php
///kode class//{
///kode hak akses(private)///
public function tampilkan_processor(){
return $this->jenis_processor;
}
}
///kode turunan class///{
public function tampilkan_processor(){
return $this->jenis_processor;
}
}
///buat objek//
//jalankan method dri class//
//jalankan method dri turunan class//
?>
Pertama kali ane coba, ane melakukan kesalahan bg, jadinya begini:
<?php
///kode class//{
///kode hak akses(private)///
public function tampilkan_processor(){
return $this->jenis_processor;
}
}
///kode turunan class///{
}
///buat objek//
//jalankan method dri class//
//jalankan method dri turunan class//
?>
Shingga turunan class masih bisa mengakses fungsi "jenis_processor" yang telah di'private' oleh class. Berarti utk mambatasi hak akses menjadi private kita harus menuliskan metode yang sama di turunan class ya bg?
Kelemahan pada hak Akses Public apa aja bang?
Sebenarnya bukan kelemahan sih, tapi lebih ke fitur hak akses public yang bisa diakses dan ditimpa dari luar class.
Fitur ini memungkinkan nilai property bisa ditimpa dengan tidak sengaja. Karena itulah biasanya property tidak disarankan di set sebagai public, tapi cukup di method-method tertentu saja.
lumayan jelas. sangat membantu. thanks