Molti sviluppatori che producono applicazioni orientate agli oggetti creano un file sorgente PHP per ogni classe definita. Uno dei più grossi inconvenienti di questo approccio è la necessità di mantenere una lunga lista di inclusioni all'inizio di ogni script (un'inclusione per ogni classe).

In PHP 5, ciò non è più necessario, in quanto è possibile definire una funzione __autoload che viene automaticamente invocata in caso si stia cercando di usare una classe/interfaccia che non sia stata ancora definita. Chiamando questa funzione, il motore di scripting ha una ultima possibilità di caricare la classe prima che PHP termini l'esecuzione con un errore.

Suggerimento: La funzione spl_autoload_register fornisce una alternative più flessibile per l'autocaricamento delle classi. Per questa ragione, usare la funzione __autoload è sconsigliato dato che in futuro potrà essere rimossa o diventare deprecata.
Nota: Prima di 5.3.0, le eccezioni sollevate dalla funzione __autoload non potevano essere intercettate nel blocco catch e avrebbero portato ad un errore fatale. Da 5.3.0+ le eccezioni sollevate nella funzione __autoload possono essere intercettate nel blocco catch, con la sola precisazione che se si sta sollevando un'eccezione definita dall'utente la classe in cui l'eccezione viene definita deve essere disponibile. La funzione __autoload può essere usata ricorsivamente per caricare la classe dell'eccezione personalizzata.
Nota: La funzionalità di autocaricamento non è disponibile se si sta usando PHP nella modalità interattiva di CLI.
Nota: Se il nome di classe è usato ad esempio in call_user_func esso può contenere alcuni caratteri pericolosi come ../. Si raccomanda di non usare direttamente valori inputati dall'utente in tali funzioni, o quanto meno di verificare l'input __autoload.

Esempio di autocaricamento Questo esempio cerca di caricare le classi MyClass1 e MyClass2 rispettivamente dai file MyClass1.php e MyClass2.php. <?php function __autoload($class_name) { include $class_name . '.php'; } $obj = new MyClass1(); $obj2 = new MyClass2(); ?> Altro esempio di autocaricamento Questo esempio tenta di caricare l'interfaccia ITest. <?php function __autoload($name) { var_dump($name); } class Foo implements ITest { } /* string(5) "ITest" Fatal error: Interface 'ITest' not found in ... */ ?> Autocaricamento con gestione delle eccezioni per 5.3.0+ Questo esempio solleva un'eccezione e dimostra come intercettarla con il blocco try/catch. <?php function __autoload($name) { echo "Si vuole caricare $name.\n"; throw new Exception("Impossibile caricare $name."); } try { $obj = new NonLoadableClass(); } catch (Exception $e) { echo $e->getMessage(), "\n"; } ?> Example outputs Si vuole caricare NonLoadableClass. Impossibile caricare NonLoadableClass. Autocaricamento con gestione delle eccezioni per 5.3.0+ - Classe dell'eccezione personalizzata mancante Questo esempio solleva un'eccezione per una eccezione personalizzata non caricabile. <?php function __autoload($name) { echo "Si vuole caricare $name.\n"; throw new MissingException("Impossibile $name."); } try { $obj = new NonLoadableClass(); } catch (Exception $e) { echo $e->getMessage(), "\n"; } ?> Example outputs Si vuole caricare NonLoadableClass. Si vuole caricare MissingException. Fatal error: Class 'MissingException' not found in testMissingException.php on line 4

Vedere anche

unserialize unserialize_callback_func spl_autoload spl_autoload_register