Auto-chargement de classes

De nombreux développeurs qui écrivent des applications orientées objet créent un fichier source par définition de classe. Un des plus gros inconvénients de cette méthode est d'avoir à écrire une longue liste d'inclusions de fichier de classes au début de chaque script : une inclusion par classe.

En PHP 5, ce n'est plus nécessaire. Vous pouvez définir une fonction __autoload() qui sera automatiquement appelée si vous essayez d'utiliser une classe ou interface qui n'est pas encore définie. Grâce à elle, vous avez une dernière chance pour inclure une définition de classe, avant que PHP n'échoue avec une erreur.

Astuce

La fonction spl_autoload_register() fournit une alternative plus flexible pour le chargement automatique de classes. Pour cette raison, l'utilisation de la fonction __autoload() n'est plus encouragée et pourrait devenir obsolète, voire être supprimée dans le futur.

Note:

Avant PHP 5.3.0, les exceptions lancées depuis la fonction __autoload ne pouvaient pas être interceptées par un bloc catch et provoquaient une erreur fatale. Depuis PHP 5.3.0+, elles peuvent être interceptées dans le bloc catch, à une précision près : si vous lancez une exception personnalisée, alors la classe de cette exception doit être disponible. La fonction __autoload peut être utilisée récursivement pour charger automatiquement la classe de l'exception personnalisée.

Note:

L'auto-chargement n'est pas disponible si vous utilisez PHP en mode interactif CLI.

Note:

Si le nom de la classe est utilisé par exemple dans la fonction call_user_func(), alors il peut contenir des caractères dangereux comme ../. Il est recommandé de ne pas utiliser d'entrées utilisateur dans de telles fonctions, ou, au moins, de vérifier l'entrée dans la fonction __autoload().

Exemple #1 Exemple avec __autoload()

<?php
function __autoload($class_name) {
	include $class_name . '.php';
}

$obj  = new MaClasse1();
$obj2 = new MaClasse2();
?>

Exemple #2 Autre exemple d'auto-chargement

<?php

function __autoload($name) {
	var_dump($name);
}

class Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>

Exemple #3 Auto-chargement avec gestion des exceptions en PHP 5.3.0+

<?php
function __autoload($name) {
	echo "Tentative de chargement de $name.\n";
	throw new Exception("Impossible de charger $name.");
}

try {
	$obj = new NonLoadableClass();
} catch (Exception $e) {
	echo $e->getMessage(), "\n";
}
?>
<?php
function __autoload($name) {
	echo "Tentative de chargement de $name.\n";
	throw new MissingException("Impossible de charger $name.");
}

try {
	$obj = new NonLoadableClass();
} catch (Exception $e) {
	echo $e->getMessage(), "\n";
}
?>

L'exemple ci-dessus va afficher :

Tentative de chargement de NonLoadableClass.
Tentative de chargement de MissingException.

Fatal error: Class 'MissingException' not found in testMissingException.php on line 4

LoadingChargement en cours