J'ai récemment appris à composer et j'ai découvert trois façons de charger automatiquement les classes en PHP depuis que je suis entré en contact avec PHP. Celles-ci incluent la méthode de chargement automatique des propres classes de PHP, la troisième méthode de chargement de PHP. de composer, un outil de gestion des dépendances tiers et la méthode de chargement automatique sous le framework Yaf de PHP. Ce blog présente principalement en détail la méthode de chargement fournie avec PHP5. Le chargement automatique des classes sous composer et Yaf sera divisé en deux parties à apprendre avec vous la prochaine fois.
1. Méthode de chargement manuel Dans des langages tels que C et C++, lorsque vous devez utiliser des classes et des méthodes associées dans un autre fichier en PHP, vous pouvez utiliser include,set_include_path() lors du chargement, et vous pouvez également obtenir le chemin de chargement via get_include_path(). Concernant set_include_path() et get_include_path(), je viens d'entrer en contact avec eux. Ici, je ne donnerai qu'une brève introduction à set_include_path(), et j'en ajouterai d'autres lorsque je rencontrerai des problèmes à l'avenir.
Tout d'abord, set_include_path() modifie dynamiquement le include_path dans php.ini dans le script, et ce include_path est la combinaison de include et require (si aucune explication particulière n'est donnée ci-dessous, include signifie include et include_once, require représente le chemin de require et require_once) à définir ou à prédéfinir. Si nous devons utiliser a.php, b.php, c.php... dans le dossier projname/home/lib/mylib/test d'un fichier main.php, si le chemin inclus n'est pas défini, écrivez-le dans la forme suivante :<?php include("projname/home/lib/mylib/test/a.php"); include("projname/home/lib/mylib/test/b.php"); include("projname/home/lib/mylib/test/c.php"); ......
<?php set_include_path("projname/home/lib/mylib/test"); include("a.php"); include("b.php"); include("c.php"); ......
<?php public function autoload($classname) { $fileName = $classname."php"; if (file_exist($fileName)) { require_once("$fileName"); } else { echo $fileName." doesn't exist!" } }
Le principe pour assurer le mécanisme de chargement automatique est de faire en sorte que le nom de la classe et le nom de fichier ont une relation correspondante, Le nom de classe + suffixe constitue le nom du fichier dans lequel se trouve cette classe. Si le fichier existe, la classe est chargée en fonction de $fileName. Si le fichier n'existe pas, l'utilisateur est informé que le fichier n'existe pas. En général, le mécanisme de chargement automatique comprend trois étapes :
Rechercher le fichier correspondant sur le disque en fonction du nom du fichier (l'exemple est le cas le plus simple, c'est-à-dire que la classe et le fichier PHP qui les appelle sont dans le même répertoire s'ils) ; ne sont pas dans le même répertoire, vous pouvez alors utiliser set_include_path() pour spécifier le chemin à charger
pour charger le fichier disque dans le système de fichiers. general include et nécessite d'inclure le fichier de classe correspondant ;
Le principe de autoload() pour implémenter le chargement automatique des classes est le suivant : il existe une correspondance unifiée entre les noms de classe et les noms de fichiers, ce qui est la clé pour implémenter le chargement automatique dans un système. Cependant, un système peut être développé par différentes personnes. S'il n'y a pas de norme unifiée convenue avant le développement, il peut y avoir différentes règles correspondantes, ce qui peut conduire à la nécessité d'implémenter plusieurs règles de chargement dans autoload(), ce qui peut entraîner un autoload( ) fonction à Très gonflé. Afin de résoudre ce problème, PHP fournit également un mécanisme de chargement automatique --- spl_autoload_register().
2). Mécanisme spl_autoload_register()
SPL est la bibliothèque PHP standard. L'abréviation de est une bibliothèque d'extensions introduite dans PHP5. Le chargement automatique SPL est implémenté en pointant le pointeur de fonction autoload_func vers la fonction de chargement automatique. SPL a deux fonctions de chargement automatique différentes, à savoir spl_autoload et spl_autoload_call. Différents mécanismes de chargement automatique peuvent être implémentés en pointant autoload_fun vers les adresses de ces deux fonctions de chargement différentes.
spl_autoload
spl_autoload est la fonction de chargement automatique par défaut implémentée par SPL. C'est une fonction qui peut accepter deux paramètres. La première fonction est $class_name, qui représente le nom de la classe à charger ; le deuxième paramètre est $file_extension, qui est un paramètre facultatif et représente l'extension du fichier de classe. Plusieurs extensions peuvent être spécifiées dans $file_extension. Les extensions peuvent être séparées par des points-virgules. Si aucune extension n'est spécifiée, l'extension par défaut .inc ou .php sera utilisée. spl_autoload change d'abord $class_name en minuscules, puis recherche les fichiers $class_name.inc ou $class_name.php dans tous les include_paths. Si le fichier correspondant est trouvé, la classe correspondante est chargée. En fait, vous pouvez utiliser manuellement spl_autoload("xxxx", ".php") pour charger la classe xxxx. Ceci est en fait similaire à require/include, mais spl_autoload est relativement plus flexible car plusieurs extensions peuvent être spécifiées.
Comme mentionné précédemment, le pointeur de fonction autoload_func contenu dans spl_autoload_register est utilisé pour spécifier la fonction de chargement à utiliser. Ensuite, nous devons attribuer l'adresse de fonction correspondante à autoload_func. spl_autoload_register() implémente la fonction d'attribution d'une valeur au pointeur de fonction autoload_func. Si la fonction spl_autoload_register() ne contient aucun paramètre, la valeur par défaut est d'attribuer spl_autoload() à autoload_func.
spl_autoload_call
Il y a en fait, un autoload_functions à l'intérieur, qui est essentiellement une table de hachage, ou pour une compréhension intuitive, nous l'imaginons comme un conteneur, et chaque élément à l'intérieur est un pointeur vers la fonction de chargement. Le mécanisme d'implémentation de spl_autoload_call est en fait relativement simple. Il parcourt le conteneur dans un certain ordre et exécute la fonction de chargement pointée par le pointeur de fonction à l'intérieur. Après l'exécution de chaque pointeur, il vérifiera si la classe requise a été chargée. Si le chargement est terminé, quittez. Sinon, poursuivez l'exécution vers le bas. Si la classe requise n'est toujours pas chargée après l'exécution de toutes les fonctions de chargement, spl_autoload_call() se termine directement. Cela signifie que même si le mécanisme de chargement automatique est utilisé, le chargement des classes peut ne pas être terminé. La clé réside dans la façon dont vous créez votre fonction de chargement automatique.
Puisqu'il existe un autoload_functions, comment y ajouter la fonction de chargement automatique créée ? Identique à spl_autoload, utilisez également spl_autoload_register() pour enregistrer la fonction de chargement dans autoload_functions. Bien entendu, les fonctions enregistrées peuvent être supprimées de la table de hachage depuis autoload_functions via la fonction spl_autoload_unregister(). Ceci est cohérent avec le modèle de conception d'usine écrit avant
Une chose qui doit être expliquée ici est l'ordre dans lequel spl_autoload_register implémente le chargement automatique. La séquence de chargement automatique de spl_autoload est la suivante : déterminez d'abord si autoload_func est vide, si autoload_func est vide, vérifiez si la fonction autoload est définie, si elle n'est pas définie, retournez et signalez une erreur si la fonction autoload() est définie, retournez. le résultat du chargement. Si autoload_func n'est pas vide, la fonction pointée par le pointeur autoload_func sera exécutée directement sans vérifier si autoload est défini. C'est-à-dire que les fonctions enregistrées avec spl_autoload_register() seront utilisées en premier.
Selon l'introduction ci-dessus, si autoload_func n'est pas vide, la fonction autoload() ne peut pas être automatiquement exécutée. Si vous souhaitez toujours utiliser la fonction autoload() tout en utilisant la fonction spl_autoload_register(), vous pouvez ajouter la fonction autoload à la table de hachage via spl_autoload_register(), c'est-à-dire spl_autoload_register(autoload()). Les exemples de code suivants illustrent comment enregistrer les méthodes ordinaires et les méthodes publiques statiques d'une classe.
普通函数的注册方法。
<?php /** * @ 普通函数的调用方法,可以调用后缀名分别为.php和.class.php的类文件 */ function loadFielEndOfPhp($classname) { $fileName = $classname.".php"; if (file_exist($fileName)) { require_once("$fileName"); } else { echo $fileName." doesn't exist!" } } function loadFielEndOfClassPhp($classname) { $fileName = $classname.".class.php"; if (file_exist($fileName)) { require_once("$fileName"); } else { echo $fileName." doesn't exist!" } spl_autoload_register("loadFielEndOfPhp"); spl_autoload_register("loadFielEndOfClassPhp"); }
类中静态的加载函数的注册方法。
<?php /** * @ 类中静态成员函数的调用方法,可调用后缀名为.php和.class.php的文件 */ class test { public static function loadFielEndOfPhp($classname) { $fileName = $classname.".php"; if (file_exist($fileName)) { require_once("$fileName"); } else { echo $fileName." doesn't exist!" } } public static function loadFielEndOfClassPhp($classname) { $fileName = $classname.".class.php"; if (file_exist($fileName)) { require_once("$fileName"); } else { echo $fileName." doesn't exist!" } } spl_autoload_register(array("test","loadFielEndOfPhp")); //spl_autoload_register("test::loadFielEndOfPhp"); //上一行的另一种写法,不是使用数组的形式完成注册; spl_autoload_register(array("test","loadFielEndOfClassPhp")); //spl_autoload_register("test::loadFielEndOfClassPhp"); //第三行的另一种写法,不是使用数组的形式完成注册; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!