Enkapsulasi adalah sebuah metode atau konsep pemrograman berorientasi objek untuk membungkus anggota atau data atau komponen atau properti dan metode atau fungsi menjadi satu kesatuan di dalam Class, dan mengamankan keduanya dari gangguan luar atau penyalahgunaan.
Enkapsulasi disebut juga "data hiding", yang berarti menyembunyikan rincian internal suatu objek, seperti rincian tentang operasi atau cara kerja suatu objek.
Penerapan enkapsulasi biasanya menggunakan 3 macam hak akses:
- Public
- Protected
- Private
1. Hak Akses Public
Memungkinkan sebuah properti atau method bisa diakses di mana saja, baik itu di classnya sendiri, di class turunannya, maupun di class lain. Contoh:
Langkah Pertama:
Saya buat class Mahasiswa, dan saya simpan dengan nama file "MahasiswaA.php". Semua properti dan methodnya saya setting Public.
<?php
/*
*bundet.com
*Wawan Beneran
*Mengenal Enkapsulasi - OOP - PHP
*/
class Mahasiswa{
public $nim;
public $nama;
public $nilai;
public function __construct($nim, $nama, $nilai)
{
$this->nim = $nim;
$this->nama = $nama;
$this->nilai = $nilai;
}
public function NamaMhs()
{
return $this->nama;
}
public function StatusNilai()
{
$status = ($this->nilai >= 60)? "Lulus" : "Gagal";
return $status;
}
}
?>
Langkah Kedua:
Saya buat class MataKuliah sebagai turunan dari class Mahasiswa, dan saya simpan dengan nama file "MatakuliahA.php". Pernyataan extends digunakan untuk mendeklarasikan class turunan.
<?php
/*
*bundet.com
*Wawan Beneran
*Mengenal Inheritance - Enkapsulasi - OOP - PHP
*/
include "MahasiswaA.php";
class MataKuliah extends Mahasiswa{
public $matakuliah;
public $dosen;
public $status;
public function Matkul($matkul, $dosen){
$this->matakuliah = $matkul;
$this->dosen = $dosen;
}
// Mengambil properti dari class turunan
public function NilaiMhs(){
return $this->nilai;
}
public function Grade()
{
if ($this->nilai >= 70){
$grade = "A";
} elseif ($this->nilai >= 60){
$grade = "B";
} elseif ($this->nilai >= 50){
$grade = "C";
} elseif ($this->nilai >= 40){
$grade = "D";
} else{
$grade = "E";
}
return $grade;
}
public function StatusNilaiMhs()
{
$this->status = $this->StatusNilai();
$this->status;
}
}
?>
Langkah Ketiga:
Saya buat file khusus untuk menampilkan rincian datanya, dan saya simpan dengan nama file "data_mahasiswaA.php".
<?php
/*
*gatewan.com
*Wawan Beneran
*Mengenal Output - Inheritance - Enkapsulasi - OOP - PHP
*/
include "MatakuliahA.php";
$datanya = new MataKuliah(54321, "Mr.Bean", 88);
//echo "<h1>Matukuliahnya</h1>";
echo "NIM : " .$datanya->nim;
echo "<br />";
echo "Nama : " .$datanya->nama;
echo "<br />";
$datanya->Matkul("Pemrograman Web Dinamis", "Wahyu Widodo");
echo "Matakuliah : " .$datanya->matakuliah;
echo "<br />";
echo "Dosen : " .$datanya->dosen;
echo "<br />";
echo "Nilai : " .$datanya->nilai;
echo "<br />";
echo "Grade : " .$datanya->Grade();
echo "<br />";
echo "Status : " .$datanya->StatusNilai();
echo "<br />";
?>
Langkah Keempat:
Jalankan File data_mahasiswaA.php. Maka demikianlah outputnya:
Intinya Semua Properti dan Method Bisa di Akses Dimana Saja
2. Hak Akses Protected
Memungkinkan sebuah properti atau method hanya bisa diakses oleh classnya sendiri dan/atau class turunannya. Contoh:
Langkah Pertama:
Masih menggunakan source code yang sama, sebagaimana di atas, hanya saja, Anda perlu merubah hak akses untuk properti nilai menjadi protected.
<?php
class Mahasiswa{
public $nim;
public $nama;
protected $nilai; //Rubah hak akses $nilai menjadi protected
...
}
?>
Saat properti dirubah ke protected, kemudian Anda running file "data_mahasiswaA.php", maka yang terjadi akan error seperti berikut:
Error Notifikasi Dikarenakan Akses Properti Secara Ilegal
Langkah Kedua:
Aturan mainnya adalah hanya classnya sendiri atau class turunannya yang bisa mengakses properti tersebut.
Sebagai contoh, saya pilih salah satu saja, yaitu pengaksesan properti terproteksi di dalam class turunannya.
Caranya:
Pada class Matakuliah (class turunan), disitu Anda buat method baru dengan akses public, lalu definisikan dengan mengembalikan properti $nilai. Dan kebetulan sudah dibuatkan di contoh code sebelumnya. Perhatikan bagian yang seperti ini!
<?php
...
// Mengambil properti dari class turunan
public function NilaiMhs(){
return $this->nilai;
}
...
?>
Langkah Ketiga:
Pada file "data_mahasiswaA.php", yang tadinya mengakses properti nilai secara langsung, silakan dirubah menggunakan method, dengan cara memanggil method NilaiMhs() di class turunannya.
<?php
...
//echo "Nilai : " .$datanya->nilai; <--- Sebelum
echo "Nilai : " .$datanya->NilaiMhs(); // <-- Sesudah
...
?>
Langkah Keempat:
Jalankan File data_mahasiswaA.php. Dan hasilnya Succsessfull!
Intinya Properti dan Method Protected Bisa di Akses Di Classnya Sendiri atau Class Turunannya
3. Hak Akses Private
Memungkinkan sebuah properti atau method hanya bisa diakses oleh classnya sendiri. Contoh:
Langkah Pertama:
Masih menggunakan source code yang sama, sebagaimana di atas, hanya saja, Anda perlu merubah hak akses untuk properti nilai menjadi private.
<?php
class Mahasiswa{
public $nim;
public $nama;
private $nilai; //Rubah hak akses $nilai menjadi private
...
}
?>
Saat properti dirubah ke private, kemudian Anda running file "data_mahasiswaA.php", maka yang terjadi akan error seperti berikut:
Error Notifikasi Dikarenakan Akses Properti Secara Ilegal
Langkah Kedua:
Aturan mainnya adalah hanya classnya sendiri yang bisa mengakses properti tersebut. Maka yang perlu kita lakukan adalah membuat method di class Mahasiswa (class induk), disitu Anda buat method baru dengan akses public, lalu definisikan dengan mengembalikan properti $nilai.
<?php
...
public function NilaiMhsPrivate() //method untuk mengakses properti $nilai yang terproteksi
{
return $this->nilai;
}
...
?>
Langkah Ketiga:
Pada file "data_mahasiswaA.php", yang tadinya masih menggunakan method di class turunannya, sekarang silakan dirubah ke method yang sudah dibuatkan di class induknya, dengan cara memanggil method NilaiMhsPrivate().
<?php
...
//echo "Nilai : " .$datanya->NilaiMhs(); <--- Sebelum
echo "Nilai : " .$datanya->NilaiMhsPrivate(); // <-- Sesudah
...
?>
Langkah Keempat:
Jalankan File data_mahasiswaA.php. Dan hasilnya Succsessfull!, Nilai sudah Tampil.
Intinya Properti dan Method Private Hanya Bisa di Akses di Dalam Classnya Saja
Anda tidak perlu khawatir tentang error diatas, itu dikarenakan method Grade yang ada di Class Matakuliah (class turunan) juga mengakses properti nilai, perlu disesuaikan, prinsipnya sama seperti yang telah saya contohkan.
Tapi, karena ini hanya sekedar contoh, jadi silakan abaikan saja, yang penting intinya paham, atau Disable saja tampilannya dengan cara menambahkan sintak komentar di file data_mahasiswaA.php.
<?php
...
echo "<br />";
//echo "Grade : " .$datanya->Grade(); <--- Disable Output Grade
echo "<br />";
echo "Status : " .$datanya->StatusNilai();
...
?>
Hasilnya;
Demikian ulasan kami tentang enkapsulasi, semoga bisa bermanfaat, salam cendekia muda!
Latihan
Legacy code untuk beajar enkapsulasi, berikut salah satu hasil latihan saya di lab kampus kala itu,
<?php
class kendaraan{
protected $jumlahRoda;
public $warna;
public $bahanBakar;
public $harga;
private $merek;
private function statusHarga(){
if ($this->harga > 5000000) $status = 'Mahal';
else $status = 'Murah';
return $status;
}
function setMerek($x){
$this->merek = $x;
}
function setHarga($y){
$this->harga = $y;
}
function bacaMerek(){
return $this->merek;
}
function bacaHarga(){
return $this->harga;
}
function __construct($x,$y){
$this->merek = $x;
$this->harga = $y;
}
}
class keretaApi extends kendaraan{
public $jumGerbong;
function setGerbong($x){
$this->jumGerbong = $x;
}
function bacaGerbong(){
return $this->jumGerbong;
}
}
//membuat instan
$kereta = new keretaApi("Argolawu", 14000000);
echo "Merek ".$kereta->bacaMerek();
echo "<br>";
echo "Harga ".$kereta->bacaHarga();
$kereta->setGerbong(10);
echo "<br>Jumlah gerbong ".$kereta->bacaGerbong();
?>
Selain itu, saya juga belajar tentang modifier di php, dan ini salah satu hasil latihan saya kala itu.
<?php
/**
* Descripton class RekeningTabungan
* @author 12131314
*/
class RekeningTabungan{
public $saldo;
function __construct($rekening,$nominal){
//$this->saldo = 400000;
$this->norek = $rekening;
$this->saldo = $nominal;
}
public function ceksaldo(){
return $this->saldo;
}
/**
* function transaksi
* Description menampilkan saldo akhir...
* @param int $jumlah_uang
* returnint $saldo
*/
public function transaksi($setor=true,$jumlah_uang){
if($setor){
$this->saldo += $jumlah_uang;
}else{
$this->saldo -= $jumlah_uang;
}
}
public function ambil ($jumlah_uang){
$this->saldo = $this->saldo - $jumlah_uang;
}
}
?>