L’autoloading non è altro che una funzionalità che ci permette di caricare automaticamente le classi (o interfacce) senza doverne necessariamente includere la dichiarazione sui nostri files.
Come sappiamo è buona norma, avere un file per ogni classe che definiamo. Prendiamo questo semplice esempio:
<?php //foo.php class Foo { public function __construct() { echo "BAZ"; } } //index.php require_once "foo.php" $foo = new Foo(); ?>
Dato che è necessario avere la definizione della classe nel file che poi la utilizzerà dovremo richiedere/includere tutti i files di classe che si desidera utilizzare.
Se ci sono solo pochi files, come in questo caso, allora non è un grosso problema, ma può esserlo invece se dovessimo caricare una libreria di grandi dimensioni tra cui tutte le sue dipendenze.
__autoload (obsoleta)
Con PHP 5 è stata introdotta la funzione magica __autoload che viene chiamata automaticamente quando il codice referenzia una classe od interfaccia che non è stata ancora caricata, dando quindi un’ultima possibilità a runtime di caricarne la definizione prima di generare un errore.
Ecco un banale esempio di implementazione:
<?php function __autoload($class_name) { filename = $class_name . ".php"; if (is_readable($filename)) { require $filename; } }
Il funzionamento è piuttosto intuitivo, se il dichiarazione della classe non è stata caricata allora viene chiamata l’__autoload
che cercherà di includere il file della dichiarazione (nome_classe.php). E’ buona norma verificare che il file esista, per farlo invece che la funzione file_exists()
ho usato is_readable()
che verifica anche che si abbiano i permessi per leggerlo.
Bene ora che conoscete questa funzione dimenticatela!!!
__autoload
è considerata obsoleta e deprecata, visto che consente un singolo autoloader, e si dovrebbe utilizzarla solo su versioni PHP che non supportino spl_autoload_register.
spl_autoload_register
Con PHP 5.1.2 infatti è stata introdottoa la spl_autoload() che ci permette di registrare autoloader multipli.
La spl_autoload_register()
ci permette di registrare delle vere e proprie catene di autoload. Di solito le funzioni sono chiamate in ordine a come vengono registrate, tuttavia esiste anche un parametro che ci permette di cambiare questo comportamento. Vediamo un esempio:
<?php function autoloadModel($class_name) { $filename = "models/" . $class_name . ".php"; if (is_readable($filename)) { require $filename; } } function autoloadController($class_name) { $filename = "controllers/" . $class_name . ".php"; if (is_readable($filename)) { require $filename; } } spl_autoload_register("autoloadModel"); spl_autoload_register("autoloadController");
In conclusione
Una delle critiche mosse all’autoloading è l’eccessivo overhead di lavoro che può portare ad un decadimento delle prestazioni.
Tuttavia, soprattutto in progetti complessi, includere una grande quantità di files tutti insieme può richiedere molto più tempo rispetto ad includere solo quelli necessari al momento, attraverso il caricamento automatico.
Risultato: l’autoloading può migliorare le prestazioni in situazioni reali!!
Tieni presente che questa è solo una presentazione superficiale dell’autoloading su PHP, approfondimenti sull’argomento dovrebbero essere fatti prendendo in considerazione lo standard PSR-0 che descrive le varie pratiche e vincoli da seguire.
Happy Coding!