Standard di autoloading PSR-4
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 12 di 91.
PSR-4 è uno standard che definisce come le classi PHP devono essere caricate automaticamente in base al loro namespace e alla posizione del file. Invece di includere manualmente il file di ogni classe, PSR-4 consente a PHP di trovare e caricare automaticamente le classi quando le usi.
La regola fondamentale è semplice: lo spazio dei nomi deve corrispondere alla struttura delle directory. Se hai una classe App\Models\User, il file dovrebbe trovarsi in App/Models/User.php.
<?php
// File: src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Puoi scrivere una semplice funzione di caricamento automatico che segue le regole PSR-4:
<?php
// File: autoload.php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// Verifica se la classe usa il prefisso del nostro namespace
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
La funzione spl_autoload_register dice a PHP di chiamare la tua funzione ogni volta che incontra una classe sconosciuta. La funzione converte lo spazio dei nomi in un percorso di file e lo carica.
Punto chiave: PSR-4 crea una mappatura prevedibile tra gli spazi dei nomi e i percorsi dei file. Quando vedi App\Models\User, sai subito che il file si trova in src/Models/User.php. Questa convenzione rende i progetti più facili da esplorare e mantenere.
Sfida
FacileCostruiamo un semplice sistema di caricamento automatico PSR-4 che carica automaticamente le classi in base al loro spazio dei nomi e alla posizione dei file.
Creerai un progetto con tre file che mostrano come PSR-4 mappa gli spazi dei nomi ai percorsi delle directory:
src/Services/Logger.php: Definisci una classeLoggernello spazio dei nomiApp\Services. Dovrebbe avere una proprietàpublic $name, un costruttore che accetta e imposta il nome e un metodolog($message)che restituisce"[name] logged: [message]".src/Services/Mailer.php: Definisci una classeMailernello spazio dei nomiApp\Services. Dovrebbe avere una proprietàpublic $sender, un costruttore che accetta e imposta il mittente e un metodosend($to)che restituisce"Mail from [sender] to [to]".main.php: Crea un caricatore automatico PSR-4 usandospl_autoload_registerche mappa il prefisso dello spazio dei nomiApp\alla directorysrc/. Il caricatore automatico dovrebbe convertire i separatori degli spazi dei nomi in separatori di directory e aggiungere.phpper trovare il file corretto. Dopo aver registrato il caricatore automatico, usa la parola chiaveuseper importare entrambe le classi, quindi crea unLoggercon il nome"FileLogger"e unMailercon il mittente"admin@site.com". Stampa il risultato della chiamata alog("System started")sul logger e asend("user@example.com")sul mailer (ciascuno su una riga separata).
L'idea fondamentale è che la funzione del caricatore automatico riceve il nome completo della classe (come App\Services\Logger) e deve convertirlo in un percorso di file (src/Services/Logger.php). Usa strpos per verificare se la classe inizia con il prefisso del tuo spazio dei nomi, substr per ottenere il nome relativo della classe e str_replace per convertire le barre inverse in barre oblique.
Provalo tu
<?php
// Implementazione dell'autoloader PSR-4
// TODO: Registra un autoloader usando spl_autoload_register
// L'autoloader deve:
// 1. Verificare se la classe inizia con il prefisso dello spazio dei nomi 'App\'
// 2. Rimuovere il prefisso 'App\' per ottenere il nome relativo della classe
// 3. Convertire i separatori dello spazio dei nomi (\) in separatori di directory (/)
// 4. Anteporre 'src/' e aggiungere '.php' per costruire il percorso del file
// 5. Includere il file se esiste
spl_autoload_register(function ($class) {
// TODO: Definisci il prefisso dello spazio dei nomi e la directory di base
// TODO: Verifica se la classe usa il prefisso dello spazio dei nomi (usa strpos)
// TODO: Ottieni il nome relativo della classe (usa substr)
// TODO: Costruisci il percorso del file sostituendo \ con / (usa str_replace)
// TODO: Includi il file se esiste
});
// TODO: Usa la parola chiave 'use' per importare le classi Logger e Mailer
// TODO: Crea un'istanza di Logger con il nome "FileLogger"
// TODO: Crea un'istanza di Mailer con il mittente "admin@site.com"
// TODO: Stampa il risultato di log("System started")
// TODO: Stampa il risultato di send("user@example.com")
?>Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online