Autocaricamento delle classi in OOP in PHP
Sapete già che per utilizzare una
classe, dobbiamo includerla
tramite require. Quando in un progetto
ci sono moltissime classi, si ottengono molti
include, che sono molto scomodi da scrivere
e difficili da controllare.
Per risolvere questo problema in PHP è stato aggiunto l'autocaricamento delle classi. L'autocaricamento permette a PHP di caricare automaticamente il file con la classe al tentativo di accesso a quella classe nel codice. Tuttavia, le classi non si caricheranno da sole - è necessario posizionarle nelle cartelle del sito in modo speciale, seguendo una qualche convenzione sui nomi dei file e delle cartelle delle classi. Si può utilizzare la convenzione integrata in PHP, oppure inventarne una propria e utilizzarla.
Per cominciare, esaminiamo la convenzione standard di PHP. Questa convenzione consiste nel fatto che se abbiamo un file con una classe, allora il percorso nelle cartelle del sito verso questo file deve coincidere con lo spazio dei nomi del file, e il nome del file deve coincidere con il nome della classe in esso contenuta. Inoltre, i nomi delle cartelle e del file devono essere in minuscolo.
Vediamo un esempio. Supponiamo di avere la seguente classe:
<?php
namespace Core\Admin;
class PageController
{
}
?>
Secondo la convenzione, questa classe dovrebbe trovarsi
nella cartella /core/admin/ nel file
pagecontroller.php.
Ora nel file index.php utilizziamo
la nostra classe, senza includerla tramite require,
ma utilizzando l'autocaricamento. Per fare ciò, all'inizio
del file in cui vengono chiamate le classi, si deve
chiamare la funzione spl_autoload_register.
Facciamolo:
<?php
spl_autoload_register(); // attiviamo l'autocaricamento
$obj = new Core\Admin\PageController; // creiamo l'oggetto tranquillamente
?>
Nel file index.php attiva il caricamento automatico
delle classi. Seguendo la convenzione sui nomi
delle cartelle e dei file, crea la classe Core\User,
la classe Core\Admin\Controller e la classe
Project\User\Data. Nel file index.php
crea oggetti di queste classi.