Secure Your Data
Konsep 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.
Bayangkan sebuah Brankas Bank.
Tanpa enkapsulasi, data bisa menjadi tidak valid.
$rekening = new Rekening();
$rekening->saldo = -1000000; // Bahaya! Saldo minus.
Visibility Modifiers
PHP menyediakan 3 keyword untuk mengatur visibilitas:
Bisa diakses dari MANA SAJA.
Ini adalah default jika tidak ditulis.
class User {
public $name;
}
$u = new User();
$u->name = "Budi"; // OK
Hanya bisa diakses oleh:
Tidak bisa diakses dari luar.
class User {
protected $nik;
}
$u = new User();
// $u->nik = "123"; // ERROR! Cannot access protected property
Hanya bisa diakses oleh Class itu sendiri.
Child Class pun TIDAK BISA mengaksesnya.
Ini adalah level keamanan tertinggi.
| Modifier | Class Sendiri | Child Class | Dunia Luar |
|---|---|---|---|
| Public | ✅ | ✅ | ✅ |
| Protected | ✅ | ✅ | ❌ |
| Private | ✅ | ❌ | ❌ |
Setter & Getter
Jika property dibuat private, bagaimana cara kita mengisi atau membaca datanya?
Jawabannya: Melalui Public Method (Setter & Getter).
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!";
}
}
}
Method untuk mengambil nilai property.
Di sini kita bisa memformat data sebelum dikembalikan.
public function getSaldo() {
return "Rp " . number_format($this->saldo);
}
$rek = new Rekening();
$rek->setSaldo(1000000); // Lewat pintu resmi
echo $rek->getSaldo(); // Rp 1,000,000
$rek->setSaldo(-5000); // Ditolak validasi
Read-only Properties (PHP 8.1+)
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).
PHP 8.1 memperkenalkan keyword readonly.
Property ini hanya boleh diisi SEKALI (biasanya di constructor), dan tidak bisa diubah lagi.
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
Jika semua property di class adalah readonly, kita bisa bikin class-nya readonly.
readonly class BlogData {
public string $title;
public string $author;
}
Sistem Login
Kita buat class Auth.
Password harus disimpan dalam bentuk Hash (terenkripsi), bukan plain text.
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);
}
}
Karena $passwordHash private, tidak ada yang bisa melihat hash aslinya dari luar.
Satu-satunya cara verifikasi adalah lewat method verify().
PHP punya cara "Magic" untuk membuat setter/getter otomatis.
Tapi hati-hati, ini bisa membuat IDE bingung (tidak ada auto-complete).
class MagicBox {
private $data = [];
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
Setter sering dibuat mengembalikan $this agar bisa di-chaining.
$user->setName("Budi")->setAge(25)->save();
public function setName($name) {
$this->name = $name;
return $this; // Return object sendiri
}
Di Laravel, Model menggunakan enkapsulasi untuk:
Jangan minta data dari objek lalu memprosesnya di luar.
Suruh objek itu memproses datanya sendiri.
if ($wallet->amount > 100) {
$wallet->amount -= 100;
}
$wallet->withdraw(100);
Enkapsulasi menyembunyikan kompleksitas internal.
Pengguna class tidak perlu tahu bagaimana data disimpan, yang penting method-nya jalan.
Membuat semua property private tapi lalu membuat Setter/Getter untuk SEMUANYA tanpa
validasi.
Itu sama saja dengan Public, cuma lebih ribet.
private/protected untuk melindungi data.readonly untuk data immutable.Data Secured.