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. La fonction spl_autoload_register() enregistre un nombre quelconque de chargeurs automatiques, ce qui permet aux classes et aux interfaces d'être automatiquement chargées si elles ne sont pas définies actuellement. En enregistrant des autochargeurs, PHP donne une dernière chance d'inclure une définition de classe ou interface, avant que PHP n'échoue avec une erreur.
Bien que la fonction __autoload() puisse également être utilisée pour le chargement automatique des classes et des interfaces, il est préférable d'utiliser la fonction spl_autoload_register(). Cela est dû au fait qu'il s'agit d'une alternative plus flexible (permettant de spécifier un nombre quelconque de chargeurs automatique dans l'application, par exemple dans les bibliothèques tierces). 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, 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 et supérieur, cela est possible a condition que 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()
Cet exemple tente de charger les classes MaClasse1 et MaClasse2, respectivement depuis les fichiers MaClasse1.php et MaClasse2.php.
<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
$obj = new MaClasse1();
$obj2 = new MaClasse2();
?>
Exemple #2 Autre exemple d'auto-chargement
Cet exemple tente de charger l'interface ITest.
<?php
spl_autoload_register(function ($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+
Cet exemple lance une exception et montre comment la traiter avec un bloc try/catch.
<?php
spl_autoload_register(function ($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";
}
?>
L'exemple ci-dessus va afficher :
Tentative de chargement de NonLoadableClass. Impossible de charger NonLoadableClass.
Exemple #4 Auto-chargement avec gestion des exceptions en PHP 5.3.0+. Exception personnalisée manquante
Cet exemple lance une exception personnalisée non-chargeable.
<?php
spl_autoload_register(function ($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
Version en cache
23/12/2024 00:23:30 Cette version de la page est en cache (à la date du 23/12/2024 00:23:30) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-language.oop5.autoload.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.