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.
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().
Example #1 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();
?>
Example #2 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 ...
*/
?>
Example #3 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";
}
?>
Il precedente esempio visualizzerà:
Si vuole caricare NonLoadableClass. Impossibile caricare NonLoadableClass.
Example #4 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";
}
?>
Il precedente esempio visualizzerà:
Si vuole caricare NonLoadableClass. Si vuole caricare MissingException. Fatal error: Class 'MissingException' not found in testMissingException.php on line 4