Konstanta adalah nama untuk nilai yang tidak pernah berubah selama script berjalan. Deklarasikan dengan const MAX_USERS = 100; atau define('MAX_USERS', 100);, lalu pakai namanya saja, tanpa $.
Menurut konvensi, nama konstanta ditulis UPPER_SNAKE_CASE. Konstanta bersifat global: konstanta yang dideklarasikan di bagian atas file terlihat di dalam setiap fungsi tanpa global.
define() vs const
Keduanya membuat konstanta, tetapi bekerja pada waktu yang berbeda. const diproses saat PHP mengompilasi file, sedangkan define() berjalan seperti panggilan fungsi lainnya.
const | define() | |
|---|---|---|
Di dalam if, loop, fungsi | Tidak | Ya |
| Nama disusun dari variabel | Tidak | Ya |
| Konstanta class | Ya | Tidak |
| Nilai boleh berupa ekspresi | Ya, dari konstanta dan literal | Ya, nilai apa pun |
| Otomatis masuk namespace | Ya | Tidak (tulis nama lengkapnya) |
Pakai const sebagai pilihan utama, karena lebih pendek dan diperiksa saat kompilasi. Pakai define() saat konstanta bergantung pada sebuah kondisi atau nama yang dihitung.
Konstanta tidak bisa diubah
Mengisi nilai ke konstanta menghasilkan parse error:
<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error: syntax error, unexpected token "=" in /home/index.php on line 3
Mendefinisikan konstanta yang sama dua kali bukan error, tetapi PHP mencetak warning dan menyimpan nilai yang pertama:
<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3
Saat sebuah nilai mungkin sudah di-set (misalnya di file konfigurasi yang dimuat lebih dari sekali), periksa dulu dengan defined():
Konstanta array
Konstanta bisa berisi array. Kamu bisa membacanya dengan NAME[key], menelusurinya dengan loop, dan mengirimnya ke mana-mana, tetapi tidak bisa mengubahnya.
Konstanta class
Di dalam class, const mendeklarasikan konstanta milik class itu. Baca dengan ClassName::NAME dari luar, dan self::NAME atau static::NAME dari dalam. Konstanta class bisa punya visibilitas, bisa final, dan sejak PHP 8.3 bisa mendeklarasikan tipe.
Sekelompok konstanta class yang berkaitan seperti STATUS_NEW dan STATUS_PAID sering kali lebih baik ditulis sebagai enum, yang juga mencegah nilai yang tidak valid dikirim ke mana-mana.
Magic constant: LINE, FILE, DIR, dan lainnya
Nilai magic constant berubah tergantung tempat ia muncul. Nilainya diisi saat kompilasi.
Yang paling sering dipakai adalah __DIR__, direktori dari file saat ini. Menyusun path include dari konstanta ini membuat path-nya tetap bekerja dari direktori mana pun script dijalankan: require __DIR__ . '/config.php';. Lihat include dan require untuk pola lengkapnya.
Konstanta bawaan yang perlu kamu tahu
PHP mendefinisikan banyak konstanta sendiri. Yang berikut ini sering sekali muncul:
PHP_EOL adalah akhir baris dari sistem tempat PHP berjalan ("\n" di Linux dan macOS, "\r\n" di Windows). Konstanta ini dimaksudkan untuk teks yang ditulis ke file dan terminal; di output HTML, baris baru tidak terlihat, jadi pakai <br> di sana.
Pertanyaan yang sering diajukan
Apa bedanya define() dan const di PHP?
const adalah konstruksi bahasa yang diproses saat file dikompilasi: bisa dipakai di level teratas dan di dalam class, tetapi tidak di dalam if, loop, atau fungsi. define() adalah fungsi yang dipanggil saat runtime, jadi bisa dipakai di mana saja dan namanya bisa disusun dari variabel, tetapi tidak bisa mendeklarasikan konstanta class.
Apakah konstanta PHP bisa berupa array?
Bisa. const COLORS = ['red', 'green']; dan define('COLORS', ['red', 'green']); sama-sama bekerja, dan kamu membaca sebuah elemen dengan COLORS[0]. Array itu tidak bisa diubah sesudahnya.
Bagaimana cara mengecek apakah konstanta sudah didefinisikan di PHP?
Pakai defined('NAME'), yang menerima nama dalam bentuk string dan mengembalikan true atau false. Pola yang umum adalah if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }. Untuk konstanta class, berikan 'ClassName::NAME'.
Apa itu magic constant di PHP?
Konstanta yang nilainya bergantung pada tempat ia ditulis: __LINE__ (baris saat ini), __FILE__ (path lengkap file), __DIR__ (direktorinya), __FUNCTION__, __CLASS__, __METHOD__, dan __NAMESPACE__. Konstanta ini ditulis dengan dua garis bawah di setiap sisi dan tidak membedakan huruf besar kecil.