Caricare le classi PHP in automatico con spl_autoload_register()

Normalmente, per includere le classi PHP all’interno delle pagine, si usa la funzione require (oppure include).
Ma quando le classi da caricare sono numerose, risulta complicato e ripetitivo inserirle tutte manualmente:

<?php require_once "classes/Config.php"; ?>
<?php require_once "classes/Cookie.php"; ?>
<?php require_once "classes/DB.php"; ?>
<?php require_once "classes/Hash.php"; ?>
<?php require_once "classes/Input.php"; ?>
...

Possiamo utilizzare quindi le funzioni del modulo SPL, ovvero Standard PHP Library, una collezione di interfacce e classi pensate proprio per risolvere problemi comuni, diponibili e compilate di default a partire da PHP 5.0.0

In particolare, possiamo utilizzare il metodo spl_autoload_register() che ci permette di automatizzare il caricamento delle nostre classi (e di ogni altro file .php all’occorrenza), fornendo solamente la root del percorso (o un array di root) e l’estensione.

Ci sono 2 modi per procedere.

Primo metodo

Il primo metodo consiste nel creare una funzione che per comodità chiamaremo my_autoloader() alla quale passiamo come parametro la variabile $class.

function my_autoloader($class) 

All’interno della funzione passiamo il nostro require (ma si applica anche a include, inutile invece l’utilizzo di include_once e require_once) impostando tra gli apici il percorso del file prima del nome della classe, concatenando $class e l’estensione, senza spazi ovviamente.

$class verrà sostituito a runtime dal nome della classe, costruendo così il percorso completo ‘classes/Config.php’

function my_autoloader($class) {
    include 'classes/' . $class . '.php';
}

A questo punto passiamo la nostra funzione come argomento di spl:

spl_autoload_register('my_autoloader');

Secondo metodo

Il secondo metodo, quello che personalmente preferisco perché più compatto, consiste nel creare la funzione anonima e passarla a spl come argomento:

spl_autoload_register(function ($class) {
    require 'classes/' . $class . '.php';
});

La funzione restituisce TRUE in caso di successo, FALSE in caso contrario.

Utilizzando queste funzioni del modulo SPL, le classi di cui abbiamo bisogno verranno caricate nel momento in cui serviranno alla nostra applicazione.


Possiamo anche passare un array di directory:

// It auto-loads any file it finds starting with class.<classname>.php (LOWERCASE), eg: class.from.php, class.db.php

spl_autoload_register(function($class_name) {

// Define an array of directories in the order of their priority to iterate through.
$dirs = array(
    'project/', // Project specific classes (+Core Overrides)
    'classes/', // Core classes example
    'tests/',   // Unit test classes, if using PHP-Unit
    );

// Looping through each directory to load all the class files. It will only require a file once.
// If it finds the same class in a directory later on, IT WILL IGNORE IT! Because of that require once!

foreach( $dirs as $dir ) {
    if (file_exists($dir.'class.'.strtolower($class_name).'.php')) {
        require_once($dir.'class.'.strtolower($class_name).'.php');
        return;
        }
    }
});

Per evitare problemi durante la deserializzazione della sessione, può essere utile utilizzare SPL prima dell’inizio della sessione:

function customAutoloader($class) {
   include 'classes/' . $class . '.php';
}

spl_autoload_register("customAutoloader"); 

session_start(); 

Se poi per qualche motivo si dovessero utilizzare le funzioni class_exists() e
method_exists() si forzerà l’autoloader a caricare la classe a cui fanno riferimento.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.