di: Riccardo Degni 13 Novembre 2009
Il concetto di lazy loading (che tradotto significa letteralmente "caricamento pigro") offerto dalle teorie delle programmazione orientata agli oggetti è davvero interessante e non deve essere sottovalutato. Per capire di cosa si tratta, proviamo ad immaginare una situazione ipotetica in cui abbiamo creato 10 classi differenti e dobbiamo caricarle dalla prima all'ultima all'interno della nostra applicazione. Dovremmo ripetere la procedura di inclusione all'inizio dei nostri script per ogni classe desiderata, in una modalità simile alla seguente:
include "oop/classes/red.php"; include "oop/classes/blue.php"; include "oop/classes/green.php"; include "oop/classes/orange.php"; include "oop/classes/pink.php"; // inclusione di altre classi...
Se andassimo poi ad inizializzare un'istanza della classe White, senza che questa sia stata prima inclusa, il parser PHP genererà ovviamente un Fatal Error:
$white = new White(); // PHP Fatal Error Fatal error: Class 'White' not found in ...
Questo ovviamente accade perché PHP non sa assolutamente cosa sia la classe White né sa dove andare a recuperarla.
Tramite il concetto di lazy loading invece, è possibile fare in modo che le classi (e non solo) vengano caricate solamente al momento necessario, ovvero quando ad esempio creiamo un'istanza con un costruttore non ancora definito.
Tutto questo diventa possibile dichiarando una funzione denominata __autoload, che consente a PHP un'ultima chance per caricare la classe. Alla funzione __autoload verrà passato un parametro che rappresenta il nome della classe non ancora definita e quest'ultimo ci servirà per andare ad includere l'apposito file che la contiene.
Ecco un esempio molto semplice:
function __autoload($class_name) {
include $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
Come possiamo notare, non esistono dichiarazioni esplicite di inclusione di classi, ma solamente istruzioni di costruzione di istanze. Tuttavia PHP non genererà alcune errore, dato che caricherà al momento opportuno i file MyClass1.php e MyClass2.php, che conterranno le rispettive classi.
Se vogliamo pianificare una situazione più elegante, in cui le classi sono poste nella nostra cartella "oop/classes" con i namespace "<class_name>.php", potremo agire in questo modo:
function __autoload($class_name) {
include "oop/classes" . strtolower($class_name) . "_class.php";
}
// carica 'oop/classes/white_class.php'
$white = new White();
// carica 'oop/classes/blue_class.php'
$blue = new Blue();
Come possiamo vedere, non occorrerà più dichiarare l'inclusione di un elevato numero di classi, ma PHP sarà sempre in grado di andare a recuperare il file corretto per l'inclusione. Questo è sicuramente il primo, grande vantaggio offerto dal concetto di lazy loading, ma non dimentichiamo anche l'impatto sulle performance: caricare molte classi senza utilizzarle realmente può portare ad un dispendio di risorse inopportuno, mentre tramite lazy loading sappiamo che solo le classi necessarie (dettate dall'andamento implicito dell'applicazione) verranno caricate.
Guida Zend FrameworkDiventate professionisti dello sviluppo Web. Zend Framework è lo... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Guida PHP con Windows e IISInstallare ambienti per lo sviluppo e la produzione di applicazioni... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso Google AdWords Base27 Febbraio 2012 a Milano |
|
|
Corso Google AdWords Base28 Marzo 2012 a Roma |