Namespace & Autoloading — PHP

Namespace menghindari konflik nama class — seperti folder untuk kode. Tanpa namespace: // Masalah: dua class dengan nama sama! class User {} // dari library A…

Begitu aplikasi Warung Bu Tini tumbuh, class-nya pindah ke file masing-masing, dan nama yang sama mulai bentrok. Namespace memberi tiap class nama lengkap, dan autoloading membuat PHP menemukan file class itu sendiri, tanpa require satu per satu. Bayangin alamat surat. Ada banyak "Jalan Melati" di Indonesia, jadi alamat lengkapnya ditulis dengan kota: "Jalan Melati, Bandung" beda dengan "Jalan Melati, Solo". Namespace adalah nama kotanya, dan PSR-4 adalah aturan pos yang mengubah alamat itu jadi rak tempat suratnya disimpan.

🧪 Tebakan cepat: class App\Services\Kasir menulis public function total(Menu $menu, ...) tapi lupa use App\Models\Menu;. Lalu index.php memanggilnya dengan object App\Models\Menu. PHP menganggap Menu di situ class yang mana? Tebak dulu, jawabannya ada di bagian "use: memanggil dengan nama pendek".

Namespace: nama lengkap untuk class

Warung memakai library pengiriman yang juga punya class Menu. Tanpa namespace, dua class bernama sama gak bisa hidup bersama:

Fatal error: Cannot redeclare class Menu (previously declared in /var/www/warung/src/Models/Menu.php:2) in /var/www/warung/vendor/ojol/api/src/Menu.php on line 2

Dengan namespace, tiap file menyebut "kota"-nya di baris pertama setelah <?php:

<?php
// src/Models/Menu.php
namespace App\Models;

class Menu
{
    public function __construct(public string $nama, public int $harga) {}
}

use: memanggil dengan nama pendek

<?php
// src/Services/Kasir.php
namespace App\Services;

use App\Models\Menu;

class Kasir
{
    public function total(Menu $menu, int $jumlah): int
    {
        return $menu->harga * $jumlah;
    }
}
Fatal error: Uncaught TypeError: App\Services\Kasir::total(): Argument #1 ($menu) must be of type App\Services\Menu, App\Models\Menu given

PSR-4: namespace jadi folder

PSR-4 adalah standar yang memetakan nama class ke lokasi file. Aturannya ditulis di composer.json:

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}
Nama class Awalan App\ diganti src/ File
App\Models\Menu src/ + Models\Menu src/Models/Menu.php
App\Services\Kasir src/ + Services\Kasir src/Services/Kasir.php
$ composer dump-autoload
Generating autoload files
Generated autoload files

Lalu index.php, file yang dibuka pertama kali:

<?php
require __DIR__ . "/vendor/autoload.php";

use App\Models\Menu;
use App\Services\Kasir;

$nasi = new Menu("Nasi Goreng", 15000);
echo (new Kasir())->total($nasi, 2) . "\n"; // 30000

Kalau file-nya gak ketemu di path itu, atau vendor/autoload.php lupa di-require, hasilnya sama:

Fatal error: Uncaught Error: Class "App\Models\Menu" not found in /var/www/warung/index.php:7

💡 Kapan perlu composer dump-autoload

⚠️ Jebakan yang sering ketemu

TL;DR: namespace App\Models; di baris pertama file memberi class nama lengkap (App\Models\Menu), jadi class bernama sama dari library lain gak bentrok. use App\Models\Menu; membuat nama pendek Menu menunjuk ke sana (tanpa use, PHP mencarinya di namespace file itu sendiri), as memberi alias, dan class bawaan ditulis \DateTime. PSR-4 memetakan namespace ke folder: dengan "App\\": "src/" di composer.json, App\Models\Menu ada di src/Models/Menu.php. Jalankan composer dump-autoload setelah mengubah autoload, require "vendor/autoload.php" sekali, dan kalau path-nya gak cocok, PHP berhenti dengan Class "App\Models\Menu" not found.

Yang akan kamu pelajari