venerdì 5 giugno 2015

Caricamento automatico delle classi in Php

In principio fu l'include (o il require) di tanti file php che contenevano funzioni. 
Poi vennero le classi, incluse a mano una per una.
Ed ora? Adesso il Php è un linguaggio molto più maturo, dotato di namespace, che permettono a classi con lo stesso nome di coesistere (con namespace diversi) all'interno dello stesso progetto. In questo modo, includere una libreria di terze parti progettata a namespace non comporta più problemi di omonimia di classi.
Altra caratteristica utilissima, novità rispetto al passato, è l'autocaricamento delle classi. Onde evitare una lunghissima lista di inclusioni, una per ogni classe, è stata introdotta la funzionalità di autoload.
Come funziona? Semplice: utilizzando la funzione spl_autoload_register() spiegheremo all'interprete Php come comportarsi in caso di classi "che non conosce", ovvero che non sono state esplicitamente incluse nello script. Per maggiori informazioni, consiglio il sito ufficiale.
Vediamo un semplice esempio:
//Autoloading classes
spl_autoload_register(function($className)
{
     //Obtain the pure class name
     $pureClassName = getRealClassName($className);
     //Build the path
     $namespace = getNameSpace($className);
     if(file_exists($namespace.'/'.$pureClassName.'.php')) {
         include_once($namespace.'/'.$pureClassName.'.php');
     }
});

function getRealClassName($fullClassName) {
     //Explode class name
     $classNameArray = explode('\\',$fullClassName);
     //Obtain the pure class name
     return end($classNameArray);
}
    
function getNameSpace($fullClassName) {
     //Explode class name
     $classNameArray = explode('\\',$fullClassName);
     //Remove the pure class name
     array_pop($classNameArray);
     //Remove the main namespace (first)
     array_shift($classNameArray); 
     //Build the path
     $namespace = implode('/', $classNameArray);
     return $namespace;
}
Breve spiegazione: nel caso il Php non trovi una classe, tenta una inclusione automatica, cercando il file posizionato nel percorso indicato dal namespace (stessa struttura delle cartelle quindi) e chiamato come il nome della classe, con estensione php. Le due funzioni getRealClassName() e getNameSpace() sono semplici funzioni che interpretano il nome della classe separando namespace dal nome "proprio" della classe stessa. Unica cosa degna di nota, viene eliminato il primo ramo del namespace, che solitamente è il nome del progetto.
Quindi, riassumendo, un comando simile:
new \ProjectName\Core\Othernamespace\Classname()
Causerà una include automatica del percorso
Core/Othernamespace/Classname.php

Nessun commento: