Dalam dunia pemrograman PHP, konstanta adalah salah satu elemen yang sering dipakai untuk membuat kode lebih terstruktur, konsisten, dan mudah dikelola. Ketika berbicara soal class, konstanta punya peran yang sangat penting. Mereka bukan sekadar angka atau string statis, melainkan identitas yang memperkuat struktur class itu sendiri. Jika variabel bisa berubah sepanjang eksekusi program, maka konstanta di class adalah “batu karang” yang kokoh—tidak bisa diubah setelah didefinisikan.
Artikel ini akan membedah secara detail tentang konstanta dalam class PHP, bagaimana cara kerjanya, bagaimana mendefinisikan, mengakses, serta penggunaannya dalam proyek nyata.
Apa Itu Konstanta dalam Class PHP?
Sebelum melangkah jauh, mari pahami dulu konsep dasar konstanta di dalam class. Konstanta adalah nilai yang ditetapkan sekali dan tidak bisa diubah selama aplikasi berjalan. Pada class PHP, konstanta biasanya digunakan untuk menyimpan informasi statis yang bersifat tetap, seperti status kode, tipe data, atau konfigurasi bawaan.
Misalnya, jika Anda sedang membuat class untuk sistem manajemen user, konstanta bisa dipakai untuk mendefinisikan peran seperti ADMIN, EDITOR, atau VIEWER. Dengan begitu, Anda tidak perlu repot mengingat angka atau string yang mewakili peran tersebut—cukup panggil konstanta dari class.
Cara Mendefinisikan Konstanta dalam Class
PHP memiliki sintaks khusus untuk mendefinisikan konstanta di dalam class. Kata kunci yang digunakan adalah const. Konstanta ini harus bersifat public secara default, tetapi dapat juga ditentukan visibilitasnya (PHP 7.1 ke atas mendukung public, protected, dan private untuk konstanta).
Contoh sederhana:
class UserRole {
public const ADMIN = 'admin';
public const EDITOR = 'editor';
public const VIEWER = 'viewer';
}
Pada contoh di atas, kita membuat tiga konstanta untuk mendefinisikan role pengguna. Nilai 'admin', 'editor', dan 'viewer' tidak bisa diubah selama program berjalan.
Cara Mengakses Konstanta dari Class
Setelah mendefinisikan konstanta, langkah berikutnya adalah bagaimana mengaksesnya. PHP menyediakan operator resolusi cakupan ganda :: yang digunakan untuk memanggil konstanta dalam class.
Contoh:
echo UserRole::ADMIN; // Output: admin
Dengan memanggil UserRole::ADMIN, kita bisa langsung menggunakan nilai konstanta tersebut tanpa perlu membuat instance dari class.
Perbedaan Konstanta dengan Properti Static
Banyak programmer pemula sering bingung antara konstanta dan properti static. Keduanya memang serupa karena sama-sama diakses menggunakan operator ::, namun ada perbedaan penting.
- Konstanta (
const)
Nilainya tetap dan tidak bisa diubah setelah didefinisikan. Tidak membutuhkan keywordstatic. - Properti static (
static $variable)
Nilainya bisa diubah selama program berjalan. Sering dipakai untuk menyimpan nilai yang sama pada semua instance class.
Contoh perbedaan:
class Example {
public const VERSION = '1.0'; // konstanta
public static $counter = 0; // properti static
}
Jika VERSION tidak bisa diubah, maka $counter bisa dinaikkan atau diturunkan kapan saja.
Visibilitas Konstanta: Public, Protected, Private
Mulai PHP 7.1, konstanta dalam class bisa memiliki level visibilitas. Sebelumnya, semua konstanta otomatis dianggap public.
- Public: bisa diakses dari mana saja.
- Protected: hanya bisa diakses dari class induk dan turunan.
- Private: hanya bisa diakses dari class itu sendiri.
Contoh implementasi:
class Config {
public const SITE_NAME = 'My Website';
protected const MAX_USERS = 100;
private const SECRET_KEY = 'abc123';
}
Dengan pengaturan visibilitas ini, developer punya kontrol lebih terhadap konstanta yang digunakan, sehingga keamanan dan keteraturan kode lebih terjaga.
Pewarisan Konstanta dalam Class
Konstanta juga bisa diwariskan dari class induk ke class turunan. Hal ini berguna ketika kita membuat hierarki class dengan aturan yang sama.
Contoh:
class BaseConfig {
public const VERSION = '1.0';
}
class ChildConfig extends BaseConfig {
public const APP_NAME = 'Child App';
}
echo ChildConfig::VERSION; // Output: 1.0
Dalam kasus ini, class ChildConfig otomatis mewarisi konstanta VERSION dari BaseConfig.
Konstanta dengan Magic Constant di PHP
Selain konstanta biasa, PHP juga menyediakan magic constants yang nilainya bisa berubah tergantung pada konteks penggunaannya. Magic constant ini berguna ketika bekerja dengan file, class, atau namespace.
Beberapa contoh magic constant yang sering digunakan:
__CLASS__→ Menampilkan nama class.__METHOD__→ Menampilkan nama method.__NAMESPACE__→ Menampilkan namespace saat ini.
Contoh penggunaannya dalam class:
class Demo {
public function showInfo() {
echo __CLASS__; // Output: Demo
echo __METHOD__; // Output: Demo::showInfo
}
}
Magic constant ini berbeda dengan const biasa karena nilainya tergantung pada lokasi pemanggilannya.
Studi Kasus: Menggunakan Konstanta untuk Status Order
Untuk memahami bagaimana konstanta berperan dalam aplikasi nyata, mari lihat contoh dalam sistem e-commerce. Status order biasanya punya nilai tetap seperti PENDING, PAID, SHIPPED, dan CANCELLED. Semua itu bisa ditangani dengan konstanta dalam class.
class OrderStatus {
public const PENDING = 'pending';
public const PAID = 'paid';
public const SHIPPED = 'shipped';
public const CANCELLED = 'cancelled';
}
function checkOrder($status) {
if ($status === OrderStatus::PAID) {
echo "Order sudah dibayar.";
}
}
checkOrder(OrderStatus::PAID); // Output: Order sudah dibayar.
Dengan pendekatan ini, Anda bisa menghindari penggunaan magic string langsung di kode. Jika sewaktu-waktu status berubah, cukup ubah di class konstanta tanpa harus mencari dan mengganti di seluruh file.
Kapan Harus Menggunakan Konstanta?
Menggunakan konstanta dalam class bukan sekadar gaya coding, melainkan strategi yang membuat kode lebih bersih dan aman. Konstanta sangat cocok digunakan ketika:
- Nilai tidak akan pernah berubah sepanjang aplikasi berjalan.
- Digunakan untuk menyimpan identitas, status, atau kode unik.
- Diperlukan standar nilai yang seragam di seluruh aplikasi.
- Ingin menghindari penggunaan string/angka langsung (hard-coded values).
Tutorial – Membuat Mini Aplikasi E-Commerce dengan Konstanta di Class PHP
Sebelum masuk ke kode, bayangkan kita punya toko online. Setiap order punya status: PENDING, PAID, SHIPPED, CANCELLED. Daripada pakai string acak, kita akan gunakan konstanta dalam class agar lebih konsisten.
Langkah 1: Definisikan Konstanta untuk Status Order
Pertama kita buat class khusus yang menyimpan semua status order.
<?php
class OrderStatus {
public const PENDING = 'pending';
public const PAID = 'paid';
public const SHIPPED = 'shipped';
public const CANCELLED = 'cancelled';
}
Dengan cara ini, kita tidak perlu menulis 'pending' atau 'paid' di banyak tempat. Cukup panggil OrderStatus::PENDING dan nilainya sudah konsisten.
Langkah 2: Buat Class Order dengan Properti Status
Sekarang kita buat class Order yang punya properti $status. Default-nya selalu PENDING ketika order baru dibuat.
<?php
class Order {
private $id;
private $status;
public function __construct($id) {
$this->id = $id;
$this->status = OrderStatus::PENDING; // default
}
public function setStatus($status) {
$this->status = $status;
}
public function getStatus() {
return $this->status;
}
public function getId() {
return $this->id;
}
}
Sekarang setiap order punya ID dan status yang bisa kita atur sesuai kebutuhan.
Langkah 3: Simulasi Proses Order
Mari kita simulasikan satu order. Awalnya status masih PENDING, lalu kita ubah menjadi PAID, dan terakhir SHIPPED.
$order1 = new Order(101);
// Status awal
echo "Order #" . $order1->getId() . " Status: " . $order1->getStatus() . PHP_EOL;
// Ubah status jadi PAID
$order1->setStatus(OrderStatus::PAID);
echo "Order #" . $order1->getId() . " Status: " . $order1->getStatus() . PHP_EOL;
// Ubah status jadi SHIPPED
$order1->setStatus(OrderStatus::SHIPPED);
echo "Order #" . $order1->getId() . " Status: " . $order1->getStatus() . PHP_EOL;
Output:
Order #101 Status: pending
Order #101 Status: paid
Order #101 Status: shipped
Langkah 4: Validasi Status Order
Bagaimana kalau ada developer yang salah memasukkan status, misalnya "done"? Itu akan bikin data berantakan. Kita bisa tambah validasi agar hanya konstanta dari OrderStatus yang boleh dipakai.
public function setStatus($status) {
$allowed = [
OrderStatus::PENDING,
OrderStatus::PAID,
OrderStatus::SHIPPED,
OrderStatus::CANCELLED
];
if (!in_array($status, $allowed)) {
throw new InvalidArgumentException("Status order tidak valid!");
}
$this->status = $status;
}
Sekarang kalau ada yang salah input:
$order1->setStatus("done");
Akan muncul error:
Fatal error: Uncaught InvalidArgumentException: Status order tidak valid!
Langkah 5: Buat Fungsi untuk Mengecek Status dengan Mudah
Kita bisa tambahkan method helper supaya mudah cek status.
public function isPaid() {
return $this->status === OrderStatus::PAID;
}
public function isShipped() {
return $this->status === OrderStatus::SHIPPED;
}
Penggunaan:
if ($order1->isPaid()) {
echo "Order #" . $order1->getId() . " sudah dibayar." . PHP_EOL;
}
Langkah 6: Tambah Konstanta untuk Konfigurasi
Selain status, konstanta juga bisa dipakai untuk konfigurasi. Misalnya maksimal jumlah item per order.
class Config {
public const MAX_ITEMS = 10;
}
Lalu digunakan:
if ($items > Config::MAX_ITEMS) {
echo "Maksimal " . Config::MAX_ITEMS . " item per order!";
}
Hasil Akhir: Kode Lengkap Mini Aplikasi
<?php
class OrderStatus {
public const PENDING = 'pending';
public const PAID = 'paid';
public const SHIPPED = 'shipped';
public const CANCELLED = 'cancelled';
}
class Config {
public const MAX_ITEMS = 10;
}
class Order {
private $id;
private $status;
public function __construct($id) {
$this->id = $id;
$this->status = OrderStatus::PENDING;
}
public function setStatus($status) {
$allowed = [
OrderStatus::PENDING,
OrderStatus::PAID,
OrderStatus::SHIPPED,
OrderStatus::CANCELLED
];
if (!in_array($status, $allowed)) {
throw new InvalidArgumentException("Status order tidak valid!");
}
$this->status = $status;
}
public function getStatus() {
return $this->status;
}
public function getId() {
return $this->id;
}
public function isPaid() {
return $this->status === OrderStatus::PAID;
}
public function isShipped() {
return $this->status === OrderStatus::SHIPPED;
}
}
// Simulasi Order
$order1 = new Order(101);
echo "Order #" . $order1->getId() . " Status: " . $order1->getStatus() . PHP_EOL;
$order1->setStatus(OrderStatus::PAID);
echo "Order #" . $order1->getId() . " Status: " . $order1->getStatus() . PHP_EOL;
if ($order1->isPaid()) {
echo "Order sudah dibayar, siap dikirim!" . PHP_EOL;
}
$order1->setStatus(OrderStatus::SHIPPED);
echo "Order #" . $order1->getId() . " Status: " . $order1->getStatus() . PHP_EOL;
Output:
Order #101 Status: pending
Order #101 Status: paid
Order sudah dibayar, siap dikirim!
Order #101 Status: shipped
