Caricamento automatico delle classi PHP con Composer

Il caricamento automatico ci consente di utilizzare le classi PHP senza la necessità di usare i metodi require(), require_one(), include() o include_one(), questo sistema è molto usato nella programmazione moderna.

Pubblicato da ,
Ultima modifica

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

 

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.