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.
Tantangan
MudahMari 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 classLoggerdalam namespaceApp\Services. Class ini harus memiliki propertypublic $name, constructor yang menerima dan menetapkan name, serta methodlog($message)yang mengembalikan"[name] logged: [message]".src/Services/Mailer.php: Definisikan classMailerdalam namespaceApp\Services. Class ini harus memiliki propertypublic $sender, constructor yang menerima dan menetapkan sender, serta methodsend($to)yang mengembalikan"Mail from [sender] to [to]".main.php: Buat autoloader PSR-4 menggunakanspl_autoload_registeryang memetakan awalan namespaceApp\ke direktorisrc/. Autoloader harus mengubah pemisah namespace menjadi pemisah direktori dan menambahkan.phpuntuk menemukan file yang benar. Setelah mendaftarkan autoloader, gunakan kata kunciuseuntuk mengimpor kedua class, lalu buatLoggerdengan name"FileLogger"danMailerdengan sender"admin@site.com". Cetak hasil pemanggilanlog("System started")pada logger dansend("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")
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online