Categorie
PHP

PHP – Autoloading

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!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.