Namespace di PHP
Hindari bentrok nama class dengan namespace dan pahami cara kerja use.
Analogi: Kode Pos
Di Indonesia ada banyak "Jalan Mawar": di Jakarta, Bandung, Surabaya. Tanpa kode pos, suratmu nyasar. Namespace adalah "kode pos" untuk class: App\Siswa dan Vendor\Siswa adalah dua class berbeda yang hidup damai berdampingan. Tanpa namespace, dua library dengan class bernama sama langsung tabrakan fatal.
<?php
// Contoh 1: dua class bernama sama, hidup berdampingan
// File: src/Siswa.php
namespace App;
class Siswa { public string $asal = "App"; }
// File: vendor/lain/Siswa.php
namespace Vendor\Lain;
class Siswa { public string $asal = "Vendor"; }
// File: index.php
require "vendor/autoload.php";
use App\Siswa; // impor versi App
use Vendor\Lain\Siswa as SiswaVendor; // alias agar tidak bentrok
$a = new Siswa(); // App\Siswa
$b = new SiswaVendor(); // Vendor\Lain\Siswa
echo $a->asal . " vs " . $b->asal;use ... as ... (alias) menyelesaikan bentrok impor: dua namespace berbeda, satu nama pendek. Tanpa alias, PHP error "Cannot use ... because the name is already in use".
<?php
// Contoh 2: namespace bertingkat + fungsi global
namespace App\Kasir;
class Struk {
public function cetak(): string {
// strlen tanpa backslash: dicari dulu di App\Kasir\strlen (tidak ada),
// lalu fallback ke global \strlen
return "Panjang: " . strlen("kopi");
}
public function waktu(): string {
// Untuk class, WAJIB backslash atau use agar tidak dicari di namespace lokal!
$now = new \DateTime(); // global DateTime
return $now->format("H:i");
}
}Aturan penting: fungsi yang tidak ditemukan di namespace lokal otomatis fallback ke global, tapi class tidak! new DateTime() di dalam namespace App; mencari App\DateTime dan fatal error. Selalu new \DateTime() atau use DateTime; di atas file.
Jebakan yang Sering Terjadi
Lupa namespace harus baris pertama. Deklarasi namespace wajib tepat setelah <?php (hanya declare boleh mendahului). Kode apa pun sebelumnya = fatal error. Gejala umum saat menempel kode contoh ke file ber-namespace.
Satu file, banyak namespace. Bisa dengan sintaks kurung kurawal, tapi sangat tidak disarankan: satu class per file adalah standar PSR-4. File multi-namespace membingungkan autoloader dan manusia.
Struktur Project Nyata
Struktur namespace standar project PHP modern (misalnya package Composer):
src/
Http/
Controller/
ProdukController.php -> App\Http\Controller\ProdukController
Model/
Produk.php -> App\Model\Produk
Service/
KeranjangService.php -> App\Service\KeranjangService
tests/
ProdukTest.php -> Tests\ProdukTestAturan: satu namespace = satu area tanggung jawab (Http untuk web, Model untuk data, Service untuk logika bisnis). Class mudah ditemukan dari namanya saja. Di composer.json, daftarkan dua prefix: "App\\": "src/" dan "Tests\\": "tests/".
Catatan teknis: Namespace tidak ada hubungannya dengan folder secara bahasa (PHP tidak peduli file di mana), tapi PSR-4 menghubungkannya secara konvensi agar autoload otomatis. Hormati konvensi itu dan autoload "berfungsi begitu saja".
Tantangan
Perbaiki class tanpa namespace
Diberi file src/Logger.php berisi class Logger {} tanpa namespace yang bentrok dengan Vendor\Logger dari package. Tambahkan namespace App; dan tulis kode index.php yang memakai keduanya sekaligus dengan alias.