Autoload PSR-4
Bikin class sendiri auto-load: mapping namespace ke folder dengan PSR-4.
Kenapa Autoload PSR-4 Ada?
Sebelum autoload, setiap file class harus di-require manual: require "Siswa.php"; require "Kasir.php"; ... puluhan baris di setiap halaman. Lupa satu = error fatal. Autoloading membalik logikanya: "jangan beri tahu aku file-nya di mana, aku akan mencarinya sendiri saat class dibutuhkan". PSR-4 adalah standar aturan pencariannya: nama class dipetakan ke path file dengan pola tetap.
<?php
// Contoh 1: struktur PSR-4 dan composer.json
// Struktur folder:
// src/
// Siswa.php -> class App\Siswa
// Kasir/
// Struk.php -> class App\Kasir\Struk
// composer.json:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
// composer dump-autoload -> bangun ulang peta classAturannya: prefix namespace App\ dipetakan ke folder src/, sisa namespace menjadi subfolder, nama class menjadi nama file + .php. App\Kasir\Struk otomatis ditemukan di src/Kasir/Struk.php. Tidak ada daftar manual, tidak ada yang terlupa.
<?php
// Contoh 2: namespace + use dalam aksi
// File: src/Siswa.php
namespace App;
class Siswa {
public function __construct(public string $nama) {}
}
// File: index.php
require "vendor/autoload.php";
use App\Siswa; // "impor" class agar bisa ditulis pendek
$s = new Siswa("Sinta"); // sama dengan new App\Siswa("Sinta")
echo $s->nama;namespace App; di baris pertama file (setelah <?php) mendeklarasikan "alamat" class. use App\Siswa; mengimpornya agar cukup tulis Siswa. Tanpa use, kamu harus menulis nama lengkap new \App\Siswa(...) setiap kali.
Jebakan yang Sering Terjadi
Nama file tidak cocok dengan nama class. PSR-4 case-sensitive: class App\Siswa wajib di src/Siswa.php, bukan src/siswa.php. Di Windows (case-insensitive) ini lolos, tapi di server Linux langsung fatal. Selalu samakan persis, termasuk kapitalnya.
Lupa composer dump-autoload. Setelah menambah class baru atau mengubah composer.json, jalankan composer dump-autoload agar peta class dibangun ulang. Gejala lupanya: "Class not found" padahal file sudah ada.
Autoload untuk Fungsi Helper
PSR-4 hanya untuk class. Untuk fungsi helper global, pakai files:
<?php
// composer.json
{
"autoload": {
"psr-4": { "App\\": "src/" },
"files": ["src/helpers.php"]
}
}
// composer dump-autoload<?php
// src/helpers.php (tanpa namespace/class, fungsi biasa)
function rupiah(float $n): string {
return "Rp" . number_format($n, 0, ",", ".");
}
function asset(string $path): string {
return "/assets/" . ltrim($path, "/");
}Setelah composer dump-autoload, rupiah() dan asset() tersedia di seluruh project tanpa require manual. Tapi batasi: helper global yang terlalu banyak mencemari namespace global. Untuk logika kompleks, tetap pakai class.
Catatan teknis: Backslash ganda
"App\\"di JSON adalah escape untuk satu backslash. Namespace memakai backslash (\) sebagai pemisah, warisan dari sintaks PHP, bukan typo. Di dalam string PHP single-quote, tulis'App\Siswa'(satu backslash cukup, kecuali sebelum kutip).
Tantangan
Struktur PSR-4 sendiri
Buat struktur: composer.json (autoload App\ ke src/), src/Produk.php (namespace App, class Produk dengan method info()), index.php yang memakai use App\Produk tanpa require manual. Jalankan dump-autoload lalu tes.