Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 classe Logger nello spazio dei nomi App\Services. Dovrebbe avere una proprietà public $name, un costruttore che accetta e imposta il nome e un metodo log($message) che restituisce "[name] logged: [message]".
  • src/Services/Mailer.php: Definisci una classe Mailer nello spazio dei nomi App\Services. Dovrebbe avere una proprietà public $sender, un costruttore che accetta e imposta il mittente e un metodo send($to) che restituisce "Mail from [sender] to [to]".
  • main.php: Crea un caricatore automatico PSR-4 usando spl_autoload_register che mappa il prefisso dello spazio dei nomi App\ alla directory src/. Il caricatore automatico dovrebbe convertire i separatori degli spazi dei nomi in separatori di directory e aggiungere .php per trovare il file corretto. Dopo aver registrato il caricatore automatico, usa la parola chiave use per importare entrambe le classi, quindi crea un Logger con il nome "FileLogger" e un Mailer con il mittente "admin@site.com". Stampa il risultato della chiamata a log("System started") sul logger e a send("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")
?>
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore PHP online