Creare un autoloading delle classi usando lo standard PSR-4

PHP Standard Recommendation (PSR) descrive una specifica per il caricamento automatico delle classi PHP, usando il percorso dei file.

Pubblicato da ,
Ultima modifica

La documentazione ufficiale per quanto riguarda lo standard PSR-4 del caricamento automatico delle classi è disponibile al seguente link

php-fig.org/psr/psr-4

Come esempio supponiamo di avere la seguente struttura di cartelle nella root del progetto

src/
   Bar/
       bar1.php  //namespace App\Bar
       bar2.php  //namespace App\Bar
          Baz/
              baz1.php  //namespace App\Bar\Baz
              baz2.php  //namespace App\Bar\Baz
   foo.php //namespace App

la cartella src/ contiene tutte le classi del nostro progetto, che a loro volta sono suddivise in altre cartelle, ad esempio la classe bar1.php si trova nella cartella src/Bar e ha come namespace App\Bar, stessa cosa per la classe bar2.php, a sua volta la cartella src/Bar ha una sottocartella src/Bar/Baz che contiene due classi baz1.php e baz2.php e entrambe hanno come namespace App\Bar\Baz, in particolare la classe foo.php nella cartella src/ ha come namespace App, inoltre ipotiziamo che ogni classe abbia un costruttore come il seguente, in modo da retituire il nome della classe

Codice PHP

<?php

......
......

 public function __construct(){
		
		echo __CLASS__;

	}

Come si nota in questo esempio di suddivisione delle classi in un ipotetico progetto, il namespace associato alle classi viene definito in base al prefisso scelto, che in questo esempio è App, e al loro percorso nella cartella src/.

Adesso facendo riferimento all'esempio proposto nella documentazione riguardo l'autoloading delle classi secondo lo standard PSR-4

php-fig.org/psr/psr-4/examples

creiamo un file autoload.php contenente il codice proposto

Codice PHP

<?php
 
 /* file autoload.php */

spl_autoload_register(function ($class) {

    // project-specific namespace prefix
    $prefix = 'App\\';

    // base directory for the namespace prefix
    $base_dir = __DIR__ . '/src/';

    // does the class use the namespace prefix?
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        // no, move to the next registered autoloader
        return;
    }

    // get the relative class name
    $relative_class = substr($class, $len);

    // replace the namespace prefix with the base directory, replace namespace
    // separators with directory separators in the relative class name, append
    // with .php
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

    // if the file exists, require it
    if (file_exists($file)) {
        require $file;
    }
});

in particolare viene utilizzata la funzione PHP spl_autoload_register e viene impostato come prefisso ($prefix) App e come percorso contenente le classi del progetto ($base_dir) la cartella src/.

A questo punto possiamo utilizzare il nostro file autoload.php per il caricamento automatico delle classi

Codice PHP

<?php

require 'autoload.php';

$foo  = new \App\Foo(); 
$bar1 = new \App\Bar\Bar1();
$bar2 = new \App\Bar\Bar2();
$baz1 = new \App\Bar\Baz\Baz1();
$baz2 = new \App\Bar\Baz\Baz2();


/* output 

App\Foo
App\Bar\Bar1
App\Bar\Bar2
App\Bar\Baz\Baz1
App\Bar\Baz\Baz2


*/