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.
../.
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
unserialize unserialize_callback_func spl_autoload spl_autoload_register