Menu
CoddyTech

Standar Autoloading PSR-4

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 12 dari 91.

PSR-4 adalah standar yang mendefinisikan cara class PHP dimuat secara otomatis berdasarkan namespace dan lokasi file-nya. Alih-alih menyertakan setiap file class secara manual, PSR-4 memungkinkan PHP menemukan dan memuat class secara otomatis saat kamu menggunakannya.

Aturan intinya sederhana: namespace harus sesuai dengan struktur direktori. Jika kamu memiliki class App\Models\User, file sebaiknya berada di App/Models/User.php.

<?php
// File: src/Models/User.php
namespace App\Models;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Kamu bisa menulis fungsi autoloader sederhana yang mengikuti aturan PSR-4:

<?php
// file: autoload.php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Periksa apakah class menggunakan awalan namespace kita
    if (strpos($class, $prefix) === 0) {
        $relativeClass = substr($class, strlen($prefix));
        $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
        
        if (file_exists($file)) {
            require $file;
        }
    }
});

Fungsi spl_autoload_register memberi tahu PHP untuk memanggil fungsi kamu setiap kali menemukan class yang tidak dikenal. Fungsi tersebut mengubah namespace menjadi jalur file dan memuatnya.

Poin Utama: PSR-4 membuat pemetaan yang dapat diprediksi antara namespace dan jalur file. Saat kamu melihat App\Models\User, kamu langsung tahu bahwa file tersebut berada di src/Models/User.php. Konvensi ini membuat proyek lebih mudah dijelajahi dan dipelihara.

challenge icon

Tantangan

Mudah

Mari kita buat sistem autoloading PSR-4 sederhana yang memuat class secara otomatis berdasarkan namespace dan lokasi file.

Kamu akan membuat proyek dengan tiga file yang menunjukkan cara PSR-4 memetakan namespace ke path direktori:

  • src/Services/Logger.php: Definisikan class Logger dalam namespace App\Services. Class ini harus memiliki property public $name, constructor yang menerima dan menetapkan name, serta method log($message) yang mengembalikan "[name] logged: [message]".
  • src/Services/Mailer.php: Definisikan class Mailer dalam namespace App\Services. Class ini harus memiliki property public $sender, constructor yang menerima dan menetapkan sender, serta method send($to) yang mengembalikan "Mail from [sender] to [to]".
  • main.php: Buat autoloader PSR-4 menggunakan spl_autoload_register yang memetakan awalan namespace App\ ke direktori src/. Autoloader harus mengubah pemisah namespace menjadi pemisah direktori dan menambahkan .php untuk menemukan file yang benar. Setelah mendaftarkan autoloader, gunakan kata kunci use untuk mengimpor kedua class, lalu buat Logger dengan name "FileLogger" dan Mailer dengan sender "admin@site.com". Cetak hasil pemanggilan log("System started") pada logger dan send("user@example.com") pada mailer, masing-masing di barisnya sendiri.

Inti pentingnya adalah fungsi autoloader menerima nama class lengkap, seperti App\Services\Logger, dan harus mengubahnya menjadi path file (src/Services/Logger.php). Gunakan strpos untuk memeriksa apakah nama class dimulai dengan awalan namespace-mu, substr untuk mendapatkan nama class relatif, dan str_replace untuk mengubah garis miring terbalik menjadi garis miring.

Coba sendiri

<?php
// Implementasi Autoloader PSR-4

// TODO: Daftarkan autoloader menggunakan spl_autoload_register
// Autoloader harus:
// 1. Periksa apakah class diawali dengan prefiks namespace 'App\'
// 2. Hapus prefiks 'App\' untuk mendapatkan nama class relatif
// 3. Ubah pemisah namespace (\) menjadi pemisah direktori (/)
// 4. Tambahkan 'src/' di awal dan '.php' di akhir untuk menyusun path file
// 5. Muat file jika ada

spl_autoload_register(function ($class) {
    // TODO: Tentukan prefiks namespace dan direktori dasar
    
    // TODO: Periksa apakah class menggunakan prefiks namespace (gunakan strpos)
    
    // TODO: Dapatkan nama class relatif (gunakan substr)
    
    // TODO: Susun path file dengan mengganti \ menjadi / (gunakan str_replace)
    
    // TODO: Muat file jika file tersebut ada
});

// TODO: Gunakan kata kunci 'use' untuk mengimpor class Logger dan Mailer

// TODO: Buat instance Logger dengan nama "FileLogger"

// TODO: Buat instance Mailer dengan pengirim "admin@site.com"

// TODO: Cetak hasil dari log("System started")

// TODO: Cetak hasil dari send("user@example.com")
?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online