Tutorial PHP #24: Namespace dan Autoloading

1. Masalah Tanpa Namespace

Bayangkan project besar dengan ratusan class. Ada kemungkinan nama class bertabrakan - misalnya kamu punya class User di modul auth, dan library pihak ketiga juga punya class User. Namespace menyelesaikan masalah ini.

2. Membuat Namespace

<?php
// File: app/Models/User.php
namespace AppModels;

class User {
    public function __construct(
        public string $nama,
        public string $email
    ) {}

    public function getInfo(): string {
        return "{$this->nama} <{$this->email}>";
    }
}
?>
<?php
// File: app/Models/Admin.php
namespace AppModels;

class Admin extends User {
    public function __construct(
        string $nama,
        string $email,
        public string $level
    ) {
        parent::__construct($nama, $email);
    }
}
?>
<?php
// File: app/Services/UserService.php
namespace AppServices;

class UserService {
    public function createUser(string $nama): string {
        return "User $nama berhasil dibuat";
    }
}
?>

3. Menggunakan Namespace dengan use

<?php
// File: index.php
namespace App;

use AppModelsUser;
use AppModelsAdmin;
use AppServicesUserService;

// Alias untuk namespace panjang
use AppServicesUserService as UserSvc;

$user    = new User("Ariq", "ariq@mail.com");
$admin   = new Admin("Budi", "budi@mail.com", "Super Admin");
$service = new UserSvc();

echo $user->getInfo();
echo $service->createUser("Cici");
?>

4. Namespace Bersarang

<?php
// Namespace bisa bertingkat
namespace AppHttpControllers;

class UserController {
    public function index(): string {
        return "Daftar semua user";
    }

    public function show(int $id): string {
        return "Detail user #$id";
    }
}
?>

5. Autoloading dengan Composer

Daripada menulis require manual untuk setiap file class, kita bisa pakai Composer autoloader yang memuat class secara otomatis berdasarkan namespace.

Langkah setup:

  1. Install Composer dari getcomposer.org
  2. Buat file composer.json di root project
  3. Jalankan composer dump-autoload
{
    "autoload": {
        "psr-4": {
            "App\": "app/"
        }
    }
}
<?php
// index.php - cukup include autoloader sekali saja
require_once "vendor/autoload.php";

use AppModelsUser;
use AppServicesUserService;

// Class otomatis dimuat dari app/Models/User.php
$user = new User("Ariq", "ariq@mail.com");
echo $user->getInfo();
?>

6. PSR-4 Autoloading Standard

PSR-4 adalah standar autoloading PHP yang paling umum digunakan. Aturannya:

  • Namespace prefix (App) dipetakan ke direktori (app/)
  • Sub-namespace dipetakan ke sub-direktori
  • Nama class sama persis dengan nama file
AppModelsUser         → app/Models/User.php
AppHttpControllersUserController → app/Http/Controllers/UserController.php
AppServicesUserService → app/Services/UserService.php

7. Ringkasan

  • Namespace menghindari konflik nama class di project besar
  • Gunakan use untuk mengimport namespace atau class tertentu
  • Composer + PSR-4 autoloading memuat class otomatis tanpa require manual
  • Standar struktur folder mengikuti namespace sangat memudahkan maintenance

Tutorial berikutnya membahas error handling dan exception di PHP.