PHP Encapsulation

Secure Your Data

SECURITY LEVEL: MAXIMUM

Security Protocols

01. Konsep Enkapsulasi
02. Visibility Modifiers
03. Getter & Setter
04. Read-only Properties
05. Studi Kasus Bank
01

The Vault

Konsep Enkapsulasi

Apa itu Enkapsulasi?

Enkapsulasi adalah mekanisme membungkus data (property) dan metode (method) menjadi satu kesatuan (Class).

Tujuannya: Melindungi data sensitif agar tidak bisa diakses atau diubah sembarangan dari luar.

Analogi Brankas

Bayangkan sebuah Brankas Bank.

Kenapa Perlu Dilindungi?

Tanpa enkapsulasi, data bisa menjadi tidak valid.


$rekening = new Rekening();
$rekening->saldo = -1000000; // Bahaya! Saldo minus.
            
02

Access Control

Visibility Modifiers

3 Level Akses

PHP menyediakan 3 keyword untuk mengatur visibilitas:

  1. Public
  2. Protected
  3. Private

1. Public (Terbuka)

Bisa diakses dari MANA SAJA.

Ini adalah default jika tidak ditulis.


class User {
    public $name;
}
$u = new User();
$u->name = "Budi"; // OK
            

2. Protected (Terbatas)

Hanya bisa diakses oleh:

Tidak bisa diakses dari luar.

Contoh Protected


class User {
    protected $nik;
}

$u = new User();
// $u->nik = "123"; // ERROR! Cannot access protected property
            

3. Private (Rahasia)

Hanya bisa diakses oleh Class itu sendiri.

Child Class pun TIDAK BISA mengaksesnya.

Ini adalah level keamanan tertinggi.

Tabel Akses

Modifier Class Sendiri Child Class Dunia Luar
Public
Protected
Private
03

Gatekeepers

Setter & Getter

Bagaimana Mengakses Private?

Jika property dibuat private, bagaimana cara kita mengisi atau membaca datanya?

Jawabannya: Melalui Public Method (Setter & Getter).

Setter (Mutator)

Method untuk mengubah nilai property.

Di sini kita bisa menaruh Validasi.


class Rekening {
    private $saldo = 0;

    public function setSaldo($jumlah) {
        if ($jumlah >= 0) {
            $this->saldo = $jumlah;
        } else {
            echo "Saldo tidak boleh minus!";
        }
    }
}
            

Getter (Accessor)

Method untuk mengambil nilai property.

Di sini kita bisa memformat data sebelum dikembalikan.


    public function getSaldo() {
        return "Rp " . number_format($this->saldo);
    }
            

Penggunaan Setter Getter


$rek = new Rekening();
$rek->setSaldo(1000000); // Lewat pintu resmi
echo $rek->getSaldo(); // Rp 1,000,000

$rek->setSaldo(-5000); // Ditolak validasi
            
04

Immutable

Read-only Properties (PHP 8.1+)

Masalah Setter Getter

Membuat setter dan getter untuk setiap property itu melelahkan (Boilerplate code).

Kadang kita hanya ingin data itu diisi sekali, lalu tidak boleh diubah lagi (Immutable).

Solusi: readonly

PHP 8.1 memperkenalkan keyword readonly.

Property ini hanya boleh diisi SEKALI (biasanya di constructor), dan tidak bisa diubah lagi.

Contoh Readonly


class User {
    public readonly string $username;

    public function __construct($username) {
        $this->username = $username;
    }
}

$u = new User("ahmad");
echo $u->username; // Bisa dibaca (Public)
// $u->username = "budi"; // ERROR! Cannot modify readonly property
            

Keuntungan Readonly

Readonly Class (PHP 8.2+)

Jika semua property di class adalah readonly, kita bisa bikin class-nya readonly.


readonly class BlogData {
    public string $title;
    public string $author;
}
            
05

Studi Kasus

Sistem Login

Skenario

Kita buat class Auth.

Password harus disimpan dalam bentuk Hash (terenkripsi), bukan plain text.

Implementasi


class Auth {
    private $passwordHash;

    public function setPassword($plainPassword) {
        // Enkripsi password sebelum simpan
        $this->passwordHash = password_hash($plainPassword, PASSWORD_DEFAULT);
    }

    public function verify($inputPassword) {
        return password_verify($inputPassword, $this->passwordHash);
    }
}
            

Keamanan Terjamin

Karena $passwordHash private, tidak ada yang bisa melihat hash aslinya dari luar.

Satu-satunya cara verifikasi adalah lewat method verify().

Magic Method __get & __set

PHP punya cara "Magic" untuk membuat setter/getter otomatis.

Tapi hati-hati, ini bisa membuat IDE bingung (tidak ada auto-complete).

Contoh Magic __set


class MagicBox {
    private $data = [];
    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
}
            

Kapan Pakai Private vs Protected?

Fluent Interface

Setter sering dibuat mengembalikan $this agar bisa di-chaining.


$user->setName("Budi")->setAge(25)->save();
            

Implementasi Fluent


public function setName($name) {
    $this->name = $name;
    return $this; // Return object sendiri
}
            

Encapsulation di Framework

Di Laravel, Model menggunakan enkapsulasi untuk:

Prinsip "Tell, Don't Ask"

Jangan minta data dari objek lalu memprosesnya di luar.

Suruh objek itu memproses datanya sendiri.

Contoh Tell Don't Ask

Bad (Ask)


if ($wallet->amount > 100) {
    $wallet->amount -= 100;
}
                    

Good (Tell)


$wallet->withdraw(100);
                    

Information Hiding

Enkapsulasi menyembunyikan kompleksitas internal.

Pengguna class tidak perlu tahu bagaimana data disimpan, yang penting method-nya jalan.

Kesalahan Umum

Membuat semua property private tapi lalu membuat Setter/Getter untuk SEMUANYA tanpa validasi.

Itu sama saja dengan Public, cuma lebih ribet.

Kesimpulan

Terima Kasih

Data Secured.

1 / 40