Caricare classi con __autoload()

di Gianni Tomasicchio - 6 marzo 2005

exception XML

Quando un progetto PHP orientato agli oggetti inizia a crescere e le righe di codice aumentano a dismisura lo sviluppatore inizia a mettere le definizioni di ciascuna classe in files distinti, salvati magari in una cartella apposita. Questa è certamente una buona norma ma porta ad un proliferare di istruzioni di inclusione che spesso vengono poste all'inizio delle pagine. Alcune di queste inclusioni possono risultare inutili se caricano classi che verranno istanziate sono in particolari situazioni.

PHP 5 offre una soluzione estremamente elegante ed efficace al problema su detto attraverso la funzione __autoload(). In pratica si tratta semplicemente di definire una funzione con il nome __autoload che verrà chiamata ogni volta che si cerca di istanziare un oggetto da una classe non ancora definita.

Se ad esempio nel nostro script è presente l'istruzione $oggetto = new mia_classe(); ma la classe mia_classe non è stata ancora definita, allora il PHP chiama (se presente) la funzione __autoload() passandogli come parametro il nome della classe mia_classe. Se questa funzione riesce a caricare la classe in questione allora lo script procede regolarmente, altrimenti viene lanciata una eccezione che però non può essere raccolta da un blocco catch data la gravità dell'errore.

Vediamo un esempio:

function __autoload($class_name)
{
   require $class_name . '.php';
}

Con la funzione riportata qui sopra, ogni volta che si cercherà di istanziare una classe non ancora definita verrà caricato (se esiste) il file che porta proprio il nome della classe e che dovrà contenerne la definizione.

Si può pensare di estendere questa funzione permettendole di caricare i files da cartelle diverse a seconda del nome della classe da istanziare. Ad esempio la seguente funzione cercherà la definizione di una ipotetica classe "common_xml_parser" nel file parser.php della cartella common/xml/

function __autoload($class_name)
{
  $file_name = strreplace('_', '/', $class_name) . '.php';
  require $file_name;
}
Effettua l'accesso o registrati per inserire un commento