Il caricamento automatico delle classi è diventato un qualcosa che non può mai mancare nella programmazione moderna, infatti con questo sistema non dobbiamo più preoccuparci di includere le nostre classi PHP nei file del nostro progetto, questo è utile sopratutto quando è strutturato con decine e decine di classi.
Per iniziare la prima cosa da fare è scaricare e installare Composer il gestore delle dipendenze per PHP.
Se si utilizza Windows basta scaricare il file Composer-Setup.exe.
Nel mio caso la struttura delle cartelle del mio progetto di esempio è la seguente:
- htdocs/
- src/
- OneClass/
- one.class.php
- TwoClass/
- two.class.php
- OneClass/
- src/
la cartella htdocs è la cartella principale del progetto (root), la cartella src ha due sottocartelle OneClass e TwoClass, che a loro volta contengono rispettivamente le classi one.class.php e two.class.php.
one.class.php
<?php
class one
{
public function h1($text)
{
echo "<h1>" . $text . "</h1>";
}
}
ho creato una funzione h1 che stampa il testo in formato H1.
two.class.php
<?php
class two
{
public function h2($text)
{
echo "<h2>" . $text . "</h2>";
}
}
e ho creato una funzione h2 che stampa il testo in formato H2.
Se dovessi usare queste due classi in un file, dovrei includerle usando i metodi include() o require() di PHP, ad esempio:
index.php
<?php
include __DIR__ . '/src/OneClass/one.class.php';
include __DIR__ . '/src/TwoClass/two.class.php';
$one = new one();
$two = new two();
print $one->h1('Hello World');
/** risultato <h1>Hello World</h1> */
print $two->h2('Hello World');
/** risultato <h2>Hello World</h2> */
se avremmo un numero notevole di classi, e classi che a loro volta includono altre classi, questo diventerebbe evidentemente un lavoro molto dispendioso.
Vediamo come fare la stessa cosa usando Composer.
Aggiungiamo un namespace alle due classi create in precedenza
one.class.php
<?php
namespace OneClass;
//...............
e
two.class.php
<?php
namespace TwoClass;
//...............
Affinchè Composer possa generare il file di autoload, abbiamo bisogno di un file composer.json, questo è un esempio di base:
composer.json
{
"description": "A simple tutorial with Composer",
"license": "MIT",
"authors": [
{
"name": "test",
"email": "email@test.it"
}
],
"autoload": {
"classmap": [
"src/OneClass",
"src/TwoClass"
]
}
}
è un file JSON, all'interno del quale ci sono delle informazioni, la chiave "classmap" è un oggetto che contiene la lista dei percorsi specifici delle nostre classi.
Carichiamo questo file nella root del progetto, che in questo esempio è htdocs, adesso usando il Prompt dei comandi andiamo a posizionarci in questa cartella, il comando è questo:
cd <percorso cartella>
usando il proprio percorso della cartella.
Adesso che ci siamo posizionati nella cartella giusta lanciamo il seguente comando.
composer update
verrà così generata una cartella "vendor" all'interno della root del nostro progetto, all'interno di questa cartella c'è il file autoload.php che ci servirà per caricare automaticamente le classi.
Il file index.php scritto in precedenza sarà così:
index.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use OneClass\one;
use TwoClass\two;
$one = new one();
$two = new two();
print $one->h1('Hello World');
/** risultato <h1>Hello World</h1> */
print $two->h2('Hello World');
/** risultato <h2>Hello World</h2> */
come si vede ho incluso il file autoload.php, e ho usato use per importare le classi usando il loro namespace seguito dal nome della classe.
Ogni volta che si modifica composer.json, ad esempio quando si aggiungeranno altre classi, bisogna lanciare il comando,
composer dump-autoload
per aggiornare l’autoloader di composer.