composerautoloadpsr-4Mahir4 mnt baca

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
<?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 class

Aturannya: 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
<?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
<?php
// composer.json
{
    "autoload": {
        "psr-4": { "App\\": "src/" },
        "files": ["src/helpers.php"]
    }
}
// composer dump-autoload
php
<?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.