Enum di PHP 8.1
Gantikan string bebas dengan enum: status yang aman dan terbaca.
Analogi: Pilihan Ganda vs Isian
Status pesanan ditulis bebas ("diproses", "Diproses", "processing", typo "diporses") adalah mimpi buruk: satu typo merusak laporan. Enum seperti pilihan ganda: nilainya terbatas pada opsi resmi (Status::Diproses), typo mustahil karena IDE autocomplete dan PHP menolak nilai asing.
<?php
// Contoh 1: enum murni (pure enum)
enum Status {
case Menunggu;
case Diproses;
case Dikirim;
case Selesai;
}
function lacak(Status $s): string {
return match ($s) {
Status::Menunggu => "Pesanan diterima",
Status::Diproses => "Sedang disiapkan",
Status::Dikirim => "Dalam perjalanan",
Status::Selesai => "Selesai, terima kasih!",
};
}
echo lacak(Status::Dikirim); // "Dalam perjalanan"
// lacak("Dikirim"); // TypeError! string bukan StatusType hint Status $s menolak apa pun selain case enum yang sah. match dengan enum bersifat exhaustive: kalau kamu menambah case baru tapi lupa menanganinya di match, PHP memberi warning (dengan bantuan static analysis).
<?php
// Contoh 2: backed enum (punya nilai) untuk database
enum StatusBayar: string {
case Belum = "belum";
case Lunas = "lunas";
case Gagal = "gagal";
public function label(): string {
return match ($this) {
self::Belum => "Menunggu pembayaran",
self::Lunas => "Sudah lunas",
self::Gagal => "Pembayaran gagal",
};
}
}
// Simpan ke database: $s->value ("lunas")
// Baca dari database: StatusBayar::from("lunas") (throw jika invalid!)
// atau: StatusBayar::tryFrom("ngawur") -> null (aman)
$status = StatusBayar::from("lunas");
echo $status->label(); // "Sudah lunas"
// Daftar semua case (untuk dropdown form!)
foreach (StatusBayar::cases() as $c) {
echo "<option value='{$c->value}'>{$c->label()}</option>";
}Backed enum menjembatani dunia kode (type-safe) dan database (string/int): ->value untuk simpan, ::from()/::tryFrom() untuk baca. tryFrom mengembalikan null untuk nilai asing (aman), from melempar exception (ketat). Enum juga bisa punya method seperti class biasa.
Jebakan yang Sering Terjadi
Enum untuk data yang berubah-ubah. Enum cocok untuk himpunan tetap dan kecil (status, role, hari). Untuk data dinamis (daftar produk, user), tetap pakai database. Menambah case enum butuh deploy kode baru.
Membandingkan backed enum dengan string. $status === "lunas" selalu false! Bandingkan enum dengan enum ($status === StatusBayar::Lunas) atau pakai ->value untuk stringnya. Ini sumber bug nomor satu pendatang baru enum.
Enum untuk Role & Akses
Selain status, enum cocok untuk role pengguna:
<?php
enum Role: string {
case Admin = "admin";
case Member = "member";
case Tamu = "tamu";
public function bolehAksesAdmin(): bool {
return $this === self::Admin;
}
}
function dashboard(Role $role): string {
if (!$role->bolehAksesAdmin()) {
return "Akses ditolak.";
}
return "Selamat datang, Admin!";
}
echo dashboard(Role::from("admin")); // Selamat datang, Admin!
echo dashboard(Role::Member); // Akses ditolak.Dibanding string bebas "admin", enum membuat typo mustahil dan IDE bisa autocomplete. Method di dalam enum (bolehAksesAdmin) menaruh logika di tempat yang tepat: dekat dengan datanya.
Catatan teknis: Enum tidak bisa di-
extendsdan tidak bisa diinstansiasi (new Status()error), tapi bisa mengimplementasikan interface. Untuk perilaku bersama antar enum berbeda, pakai interface + trait.
Tantangan
Enum status tugas
Buat backed enum StatusTugas: string dengan case Todo = "todo", Jalan = "jalan", Selesai = "selesai", plus method label() yang mengembalikan label Indonesia. Uji StatusTugas::from("jalan")->label().
Kuis Bab
Uji pemahamanmu: Bab 9: OOP
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Operator apa untuk mengakses method object di PHP?
2.Apa guna visibility private pada property?
3.Kapan __destruct dijalankan?
4.Manakah hubungan yang TEPAT untuk inheritance?
5.Apa masalah yang dipecahkan trait?