La documentazione ufficiale per quanto riguarda lo standard PSR-4 del caricamento automatico delle classi è disponibile al seguente link
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
*/