Proyek kecil dengan lima class tidak mengenal masalah penamaan. Namun begitu proyek membesar — ratusan class milik kita sendiri ditambah puluhan pustaka eksternal dari Composer — tabrakan nama (name collision) menjadi pertanyaan bukan “apakah”, melainkan “kapan”. Dua tim yang sama-sama menulis class bernama User untuk modul autentikasi dan modul blog akan saling menghancurkan program tanpa pernah saling kenal. PHP menjawab masalah ini dengan namespaces: mekanisme pengelompokan class, interface, function, dan konstanta ke dalam ruang nama terpisah. Section ini membahas namespaces dari konsep hingga praktik; chapter pembuka ini membangun pemahaman konseptualnya terlebih dahulu.
Masalah Bentrok Nama #
Mari kita lihat apa yang terjadi ketika dua class bernama sama hidup dalam satu program. Berkas berikut mendeklarasikan class User dua kali — satu versi menyimpan nama pengguna, satu versi menyimpan email:
<?php
class User
{
public function __construct(public string $nama) {}
}
class User
{
public function __construct(public string $email) {}
}Output yang Dihasilkan:
Fatal error: Cannot redeclare class User (previously declared in /home/z/my-project/php-course/content/php/namespaces-dan-autoloading/memahami-namespaces/.verify_tmp.php:3) in /home/z/my-project/php-course/content/php/namespaces-dan-autoloading/memahami-namespaces/.verify_tmp.php on line 8PHP menolak berkas ini sebelum satu baris logika pun dijalankan: Cannot redeclare class User adalah fatal error yang terdeteksi saat kompilasi. Dalam proyek nyata, kedua deklarasi biasanya berada di berkas berbeda yang di-include dari tempat berbeda, sehingga tabrakan baru muncul ketika dua modul yang tidak berkaitan akhirnya dimuat bersamaan — skenario yang sangat menyulitkan penelusuran.
Sebelum ada namespaces, komunitas PHP mengatasinya dengan prefiks manual seperti Auth_User dan Blog_User. Konvensi ini berfungsi, tetapi tidak dijaga oleh bahasa: nama menjadi panjang, tidak berstruktur, dan tetap rawan bentrok ketika dua pustaka kebetulan memilih prefiks yang sama.
Namespaces sebagai Folder untuk Simbol #
Cara tercepat memahami namespaces adalah mengingat cara kita mengelola berkas di komputer. Dua berkas yang sama-sama bernama laporan.txt boleh hidup berdampingan karena berada di folder berbeda — identitasnya adalah jalur lengkapnya, bukan namanya saja. Namespaces membawa logika yang sama ke dunia simbol PHP:
| Konsep filesystem | Padanan di PHP |
|---|---|
| Folder/direktori | namespace |
| Nama berkas | nama class / function / konstanta |
Jalur lengkap dokumen/2026/laporan.txt | nama lengkap App\Toko\Produk |
Mari kita wujudkan dalam kode. Deklarasi namespace diletakkan di awal berkas, dan semua class di bawahnya menjadi milik namespace tersebut:
<?php
namespace App\Toko;
class Produk
{
public function __construct(public string $nama) {}
}
$produk = new Produk("Kopi Gayo");
echo get_class($produk) . "\n";Output yang Dihasilkan:
App\Toko\ProdukMari kita bedah hasilnya:
- Baris 3 (
namespace App\Toko;): seluruh kode di berkas ini kini tinggal di dalam ruang namaApp\Toko. Tanda pemisah antar segmen adalah backslash (\), mirip pemisah folder di path. - Baris 5-8: class tetap ditulis dengan nama pendek
Produk. Nama pendek hanyalah cara singkat menunjuk nama lengkapnya. - Baris 10 (
new Produk(...)): dari dalam namespace yang sama,Produkotomatis dipahami sebagaiApp\Toko\Produk. - Baris 11 (
get_class($produk)): fungsi ini mengembalikan nama lengkap class sebagai string — hasilnyaApp\Toko\Produk, bukan sekadarProduk. Inilah bukti bahwa PHP menyimpan identitas penuh, bukan nama pendek.
Nama lengkap App\Toko\Produk juga bisa dibaca seperti struktur folder bertingkat — App berisi Toko, dan di dalamnya ada class Produk:
App\
├── Autentikasi\
│ └── User (nama lengkap: App\Autentikasi\User)
└── Blog\
└── User (nama lengkap: App\Blog\User)Class User milik autentikasi dan class User milik blog kini memiliki identitas berbeda, persis seperti dua laporan.txt di dua folder berbeda.
Dua Class Bernama Sama yang Hidup Berdampingan #
Sekarang mari kita buktikan bahwa masalah di awal chapter benar-benar terselesaikan. Agar dua namespace bisa diperlihatkan dalam satu berkas contoh, kita memakai sintaks kurung kurawal namespace Nama { ... } — bentuk deklarasi alternatif yang akan dibedah lengkap pada chapter berikutnya:
<?php
namespace Auth {
class User
{
public function __construct(public string $nama) {}
}
}
namespace Blog {
class User
{
public function __construct(public string $email) {}
}
$admin = new \Auth\User("Budi");
$penulis = new User("[email protected]");
echo $admin->nama . "\n";
echo $penulis->email . "\n";
}Output yang Dihasilkan:
Budi
[email protected]Mari kita bedah bagian-bagiannya:
- Baris 3-8: class
Userpertama hidup di namespaceAuth; nama lengkapnyaAuth\User. - Baris 10-15: class
Userkedua hidup di namespaceBlog; nama lengkapnyaBlog\User. Tidak adaCannot redeclare classkarena keduanya memang simbol yang berbeda. - Baris 17 (
new \Auth\User("Budi")): nama yang diawali backslash adalah nama lengkap yang “mulai dari akar” — padanan path absolut seperti/var/wwwdi filesystem. Penulisan ini menembus namespace saat ini dan menunjuk tepat keAuth\User. - Baris 18 (
new User(...)): nama tanpa awalan backslash dicari dulu di namespace saat ini (Blog), sehingga berhasil menemukanBlog\User.
Namespaces di Dunia Nyata #
Jika Anda pernah membuka kode framework atau pustaka PHP modern, namespaces dengan struktur bertingkat adalah hal pertama yang akan Anda jumpai:
| Pustaka | Contoh nama class lengkap |
|---|---|
| Symfony HttpFoundation | Symfony\Component\HttpFoundation\Request |
| Guzzle | GuzzleHttp\Client |
| Komponen Eloquent (Laravel) | Illuminate\Database\Eloquent\Model |
Perhatikan polanya: segmen pertama adalah identitas pembuat pustaka (Symfony, GuzzleHttp, Illuminate), disusul segmen sub-fitur yang mengelompokkan class terkait. Segmen pertama berperan seperti merek dagang — selama setiap pustaka memakai identitas yang unik di segmen pertama, class di dalamnya tidak akan pernah bertabrakan dengan pustaka lain maupun dengan kode proyek Anda. Inilah yang memungkinkan ribuan paket berbagi satu proyek Composer tanpa saling mengganggu.
Satu hal penting untuk catatan: PHP tidak memaksa namespace mengikuti struktur folder di disk — keduanya secara teknis independen. Namun konvensi industri lewat standar PSR-4 menyatukan keduanya sehingga lokasi berkas bisa ditentukan dari nama class; kaitan ini kita bahas pada chapter PSR-4 Autoloading .
Ringkasan #
Namespaces memindahkan masalah penamaan dari wilayah keberuntungan ke wilayah struktur: nama class menjadi alamat bertingkat seperti path di filesystem, dua class bernama sama bisa hidup berdampingan karena nama lengkapnya berbeda, dan segmen pertama nama berperan sebagai identitas pemiliknya. Dengan mental model “folder untuk class” ini, kita siap mempelajari aturan penulisannya secara formal: di mana deklarasi diletakkan, bentuk sintaksnya, dan bagaimana sub-namespace disusun — semua itu topik chapter Namespace Declarations .