La propria funzione per il caricamento automatico delle classi in OOP in PHP
Spesso il caricamento automatico predefinito potrebbe non soddisfarvi per qualche motivo. In tal caso è possibile scrivere il proprio caricamento automatico.
Per fare ciò, alla funzione spl_autoload_register
bisogna passare come primo parametro la
vostra funzione di callback scritta da voi. Questa funzione verrà chiamata
quando PHP rileverà l'accesso a
una classe non caricata. Il parametro di questa funzione
conterrà il nome della classe con il namespace:
<?php
spl_autoload_register(function($class) {
// nella variabile $class ci sarà il nome della classe con il namespace
});
?>
E il compito della funzione sarà di caricare
quella classe tramite require in base al nome della classe.
Ciò significa che all'interno di questa funzione dobbiamo scrivere
la nostra regola per il caricamento delle classi, cioè
la nostra convenzione di denominazione.
Scriviamo un esempio di un nostro caricamento automatico. Supponiamo, ad esempio, che il percorso del file della classe dalla root del sito sarà lo stesso del namespace, ma mantenendo il case dei caratteri.
Ciò significa, se abbiamo una classe Core\Admin\PageController,
allora il percorso ad essa dovrebbe essere Core/Admin/PageController.php.
Come potete vedere, per trasformare il nome della classe
con il suo namespace basta sostituire
gli slash inversi con quelli diretti, e al nome della classe
aggiungere .php. Facciamolo:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Tuttavia, otterremo un percorso relativo al file (relativo alla root del sito). È meglio creare un percorso assoluto, in questo modo:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
C'è un'altra sfumatura. In diversi sistemi operativi
il percorso attraverso le cartelle può essere con lo slash diretto
o con quello inverso. Rendiamo il nostro codice indipendente
dal sistema operativo. Per fare ciò, invece
dello slash diretto per separare i percorsi, utilizzeremo
la costante DIRECTORY_SEPARATOR,
che contiene lo slash corretto per il sistema operativo
in cui è attualmente in esecuzione il nostro
script. Alla fine otterremo il seguente codice:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testate la funzione di caricamento automatico che ho creato.
Inventate la vostra regola di caricamento automatico e implementatela.