devdev / in the loop

Autoloading PHP PSR-4 utlizzando Composer

Abbiamo già visto come gestire l’autoloading delle classi in PHP utilizzando la SPL (Standard PHP Library), una tecnica che è ben definita nello standard PSR-4.

Grazie a composer, possiamo sfruttare il suo meccanismo interno di autoloading basato proprio su questo standard evitando così di scrivere l’intero sistema. Se siete alle prime armi sulla questione dell’autoloading delle classi, vi consiglio prima di leggere l’articolo dedicato.

Se invece già utilizziamo composer per i nostri progetti, vediamo come sfruttarlo per caricare dinamicamente le classi che scriviamo.

Definire l’autoloading

Come per la gestione dei pacchetti, dovremmo scrivere le impostazioni per l’autoloading nel file composer.json. Se ne abbiamo già uno, accodiamo queste impostazioni a require. Se invece è vuoto, editiamo il file come in questo esempio:

"autoload": {
    "psr-4": {
        "App\\": "app/"
     }
}

Nota: se non utilizziamo già composer nel nostro progetto, dobbiamo provvedere a includere il file autoload generato.

Che significa?

Dichiariamo innanzitutto che App è il nostro vendor name, che può essere il nostro nome, quello della società o del progetto open source di riferimento. Nel nostro esempio (così come per progetti che magari non renderete open source), ci limitiamo ad un semplice “App” perché non c’è rischio di duplicazione con altri.
Poi specifichiamo il percorso – relativo alla root del progetto – come app/.

Dichiariamo una classe
Come viene scritto nella specifica PSR-4, quando faremo il loading di una classe in un namespace così composto:

App/ClasseProva

Il sistema cercherà il file [root del progetto]/app/ClasseProva.php e lo includerà automaticamente.

Nel file ClasseProva.php dovremmo naturalmente dichiarare che quella classe si trova nel namespace App:

// ClasseProva.php
namespace App;
class ClasseProva {
     //
}

Questo discorso vale anche per i sotto-namespace. Sempre utilizzando la nostra impostazione in composer.json, creeremo delle sotto-directory corrispondenti ai sotto-namespace:

// ClasseTest.php
namespace App\Test;
class ClasseTest {
    //
}

L’autoloader cercherà il file [root del progetto]/app/Test/ClassTest.php e lo includerà automaticamente.

Possiamo quindi usare quest’approccio che io definisco write-and-forget senza includere valanghe di file e senza scrivere un autoloader dedicato.

Questo articolo ti è stato utile?
PHP – LETTURA 6 MINUTI PHP 8: l’operatore null-safe
L’introduzione dell’operatore null coalescing con PHP 7 è stato un buon passo avanti per la pulizia del codice, ma non…
Laravel – LETTURA 4 MINUTI Aggiungere phpMyAdmin a Laravel Sail
Anche se a questo punto lo sapete già, è giusto dire che phpMyAdmin è sicuramente il tool dbms open  source…
PHP – LETTURA 4 MINUTI Usare glob() in PHP per elencare i file di una directory
Spesso abbiamo utilizzato (lo so, l’avete fatto anche voi) la combinazione di opendir(), readdir() e closedir() per elencare i file…
PHP – LETTURA 5 MINUTI Installare PHP su macOS Monterey con homebrew (anche su M1)
L’ultima versione di macOS 12 Monterey non porta più con sé preinstallato PHP. Difatti, una nota nel conf http.conf di…
Roba figa da
if (weekend) {
    relax();
}
la nostra newsletter, ogni tanto.