Lazy loading nella programmazione OOP di PHP

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.

La funzione __autoload

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.

Guide PHP

Guida Zend Framework

Diventate professionisti dello sviluppo Web. Zend Framework è lo...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Guida PHP con Windows e IIS

Installare ambienti per lo sviluppo e la produzione di applicazioni...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Google AdWords Base

27 Febbraio 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

28 Marzo 2012 a Roma
Disponibilità: 7 Posti