Nama adalah abstraksi termurah yang Anda tulis: tidak menambah waktu eksekusi, tidak menambah dependensi, tetapi menentukan berapa lama pembaca memahami kode Anda. Sebagian aturan penamaan sudah diamanatkan PSR-1 — class PascalCase, method camelCase, konstanta huruf kapital — dan bab sebelumnya sudah membahasnya sebagai kewajiban gaya. Chapter ini melengkapinya dengan konvensi luas ekosistem PHP untuk simbol lain (interface, abstract class, trait, test) serta kriteria yang lebih penting dari sekadar format: nama yang mengungkapkan niat, boolean yang terbaca seperti kalimat, dan kosakata yang konsisten di seluruh domain.
Tabel Konvensi Penamaan #
Tabel berikut merangkum konvensi yang diterima luas di ekosistem PHP — sebagian wajib menurut PSR-1, sebagian kebiasaan yang diikuti Laravel, Symfony, dan proyek FIG sendiri:
| Elemen | Konvensi | Contoh |
|---|---|---|
| Class, interface, trait, enum | PascalCase | InvoiceGenerator |
| Method dan function | camelCase | generateInvoice() |
| Variabel dan property | camelCase | $totalBelanja |
| Konstanta class | UPPER_SNAKE | MAX_ITEM |
| Konstanta global | UPPER_SNAKE | BATAS_MINIMAL_PESANAN |
| Interface | Suffix Interface (gaya FIG) | LoggerInterface |
| Abstract class | Prefix Abstract | AbstractRepository |
| Trait | PascalCase, biasanya kata kemampuan | HasUuid |
| Test class | Suffix Test | InvoiceTest |
| Enum dan case-nya | PascalCase | StatusPesanan::Terkirim |
Dua baris terakhir layak digarisbawahi. Nama trait berbentuk kata kemampuan (HasUuid, Trackable) membuat class yang memakainya terbaca alami: class Invoice { use HasUuid; }. Sementara case enum memakai PascalCase, bukan UPPER_SNAKE seperti konstanta — konvensi modern membedakan keduanya karena case enum adalah nilai bertipe, bukan konstanta sekali tulis.
Nama yang Mengungkap Niat #
Nama variabel satu-dua huruf ($d, $h, $i) memaksa pembaca menelusuri penggunaannya dulu sebelum memahami maksudnya. Nama yang baik bekerja seperti kalimat: hitungTotalBelanja(array $daftarItem) tidak butuh komentar apa pun. Bandingkan dua fungsi berikut yang menghasilkan output identik:
<?php
function proses($d)
{
$h = 0;
foreach ($d as $i) {
$h += $i['hrg'] * $i['qty'];
}
return $h;
}
echo proses([['hrg' => 50000, 'qty' => 3]]) . "\n";Output yang Dihasilkan:
150000Versi kedua mengganti seluruh nama tanpa menyentuh logika:
<?php
function hitungTotalBelanja(array $daftarItem): int
{
$total = 0;
foreach ($daftarItem as $item) {
$total += $item['hargaSatuan'] * $item['jumlah'];
}
return $total;
}
echo hitungTotalBelanja([['hargaSatuan' => 50000, 'jumlah' => 3]]) . "\n";Output yang Dihasilkan:
150000Perubahan-perubahan pada versi kedua:
proses($d)menjadihitungTotalBelanja(array $daftarItem)— niat fungsi terbaca dari nama, bukan dari isi.$h,$i, dan keyhrg/qtymenjadi$total,$item,hargaSatuan/jumlah— singkatan hemat huruf tapi mahal pemahaman diganti kata penuh.- Type declaration
: intmemperjelas kontrak; output tetap150000karena perilaku tidak berubah sedikit pun.
Aturan praktisnya: hindari singkatan kecuali yang sudah menjadi kosakata umum ($id, $db, HTTP URL). Nama panjang yang jelas hampir selalu menang atas nama pendek yang harus ditebak.
Penamaan Boolean #
Boolean paling terbaca ketika namanya berbentuk pertanyaan yang dijawab true/false. Bahasa PHP dan ekosistemnya menyepakati prefix tertentu: is untuk status (isAktif, isValid), has untuk kepemilikan (hasDiskon, hasPermission), dan can/should untuk kemampuan atau kelayakan. Fungsinya terasa langsung dalam kondisi:
<?php
class Pelanggan
{
public function __construct(
private bool $aktif,
private int $poinLoyalti,
) {
}
public function isAktif(): bool
{
return $this->aktif;
}
public function hasDiskonLoyalti(): bool
{
return $this->poinLoyalti >= 100;
}
}
$budi = new Pelanggan(aktif: true, poinLoyalti: 150);
$siti = new Pelanggan(aktif: false, poinLoyalti: 40);
var_dump($budi->isAktif());
var_dump($budi->hasDiskonLoyalti());
var_dump($siti->isAktif());
var_dump($siti->hasDiskonLoyalti());Output yang Dihasilkan:
bool(true)
bool(true)
bool(false)
bool(false)Mari kita amati hasilnya: Budi yang aktif dengan 150 poin mendapat bool(true) dua kali, sementara Siti yang nonaktif dengan 40 poin mendapat bool(false) dua kali. Dengan nama seperti ini, kondisi di kode pemanggil terbaca seperti kalimat — if ($pelanggan->isAktif() && $pelanggan->hasDiskonLoyalti()) — tanpa perlu membuka isi method. Sebaliknya, nama boolean tanpa prefix seperti $status atau $flag memaksa pembaca mencari tahu dahulu apakah true berarti baik atau buruk.
Menghindari Encoding ala Hungarian #
Gaya lawas bernama Hungarian notation menyematkan tipe data di awal nama: $strNama, $intUsia, $arrItemBelanja. Gaya ini lahir di era ketika IDE belum mampu menampilkan tipe sebuah variabel. Di PHP modern, informasi itu redundan — type declaration, property bertipe, dan IDE sudah menyajikannya secara gratis:
<?php
$strNama = 'Budi';
$intUsia = 25;
$arrItemBelanja = ['Kopi', 'Teh', 'Gula'];
echo "{$strNama} berusia {$intUsia} tahun\n";
echo 'Jumlah item: ' . count($arrItemBelanja) . "\n";Output yang Dihasilkan:
Budi berusia 25 tahun
Jumlah item: 3Kode di atas berjalan benar, tetapi prefix tipe mengotori setiap pemakaian: $strNama lebih sulit dibaca daripada $nama, dan ketika tipe berubah (misalnya $intUsia diganti menjadi DateTimeImmutable), namanya berbohong. Versi bersihnya sederhana: $nama, $usia, $itemBelanja — tipe diserahkan pada deklarasi, nama fokus pada makna. Prinsip umumnya: jangan meng-encode informasi yang sudah diketahui compiler atau IDE ke dalam identifier.
Kosakata yang Konsisten per Domain #
Masalah penamaan yang paling merusak keterbacaan bukanlah salah kapital, melainkan kosakata yang berubah-ubah untuk konsep yang sama. Ketika satu modul menyebut retrieveUsers(), modul lain fetchUsers(), dan modul ketiga getUsers(), pembaca bertanya-tanya apakah ketiganya berbeda — padahal tidak. Pilih satu kata per konsep dan disiplinlah:
| Konsep | Pilih satu | Hindari memakai bergantian |
|---|---|---|
| Mengambil data | get | get, fetch, retrieve |
| Menyimpan data baru | create | create, insert, store |
| Entitas pengguna jasa | Pelanggan | Pelanggan dan Customer sekaligus |
| Operasi waktu | DateTimeImmutable | campur tanggal() dan date() |
Konsistensi juga berlaku untuk pilihan bahasa. Kode umum mengikuti bahasa Inggris standar industri, sementara entitas domain boleh memakai Bahasa Indonesia — keduanya sah selama tidak dicampur untuk konsep yang sama. Jika domain menyebut entitasnya Pelanggan, jangan tiba-tiba menyebut User di modul lain.
Ringkasan #
Konvensi penamaan PHP punya kerangka yang jelas: PascalCase untuk class dan enum, camelCase untuk method dan variabel, UPPER_SNAKE untuk konstanta, suffix Interface dan Test, prefix Abstract, serta trait berbentuk kata kemampuan. Di atas format itu, kualitas nama ditentukan oleh niat yang terungkap — nama lengkap bukan singkatan, boolean berprefix is/has, tanpa encoding tipe, dan kosakata yang konsisten per domain. Nama yang baik adalah fondasi kode bersih, dan menyusun kode itu sendiri menjadi fokus chapter Clean Code berikutnya.