Cet article vous apporte les connaissances pertinentes sur le chargement automatique du chargeur dans thinkphp. Il comprend principalement les connaissances pertinentes sur le chargement de Composer. J'espère qu'il sera utile à tout le monde !
1. Chargement automatique de l'analyse du code source du chargeur
1-1 Objectifs d'apprentissage
Deux façons de charger automatiquement les classes
spl_autoload_register doit pouvoir utiliser
pour implémenter le chargement automatique des classes de fichiers personnalisées
Insérer la description de l'image ici Premier chargement dans la classe de chargement base.php, puis appelé le registre méthode.
Venez sur thinkphplibrarythinkLoader.php et il existe une méthode de registre. Dans cette méthode, nous apprenons d'abord le premier point de connaissance spl_autoload_register() et parlons de la vie passée et présente et de l'utilisation simple de spl_autoload_register. .La prochaine étape est le chemin racine du projet et le chemin du compositeur.
Insérer la description de l'image iciÀ partir d'ici, vous chargez le fichier composer, le processus est également très simple
Déterminez si composer est un répertoire
Déterminez si autoload_static.php sous le chemin est un file
Introduire le fichier autoload_static.php
Renvoyer tous les retours du tableau de classes déclarées
Obtenir la dernière classe ComposerStaticInit30742487e00917c888d89ba216f165b9
Judge Compos Les données du tableau existent-elles dans erStaticInit30742487e00917c888d89ba216f165b9 Suivant Vous pouvez y aller ? au fichier suppliercomposerautoload_static.php pour voir ces deux attributs
1-3 Enregistrez l'espace de noms
Le fichier est toujours la méthode d'enregistrement de thinkphplibrarythinkLoader.php
Deux espaces de commande sont enregistrés ici, à savoir think et traits. Ensuite, vous entrerez dans la méthode addNamespace
Dans la méthode addNamespace, ajoutez l'espace Psr4
Ensuite, vous arriverez à la méthode addPsr4, qui enregistrera les deux espaces de noms dans la classe ComposerStaticInit1e269472f484e157e90227b420ffca7a. 4 et Parmi les deux attributs $ prefixDirsPsr4,
est utilisé pour vérifier ce qui précède et effectuer un débogage de point d'arrêt. Cela devrait être clair lorsque vous voyez ces données. Quant aux traits, la même méthode d'enregistrement est utilisée.
Jusqu'à présent, l'enregistrement de l'espace de noms est terminé. Ensuite, étudions ce qu'est l'espace de noms psr4.1-4 Qu'est-ce que Psr4
psr est simplement compris comme le chemin du fichier et les spécifications pertinentes pour le chargement automatique des classes correspondantes. Actuellement, TP5.1 utilise la spécification psr4
Les classes ici font référence à la classe. , interface, structure de super classe
Une classe complète nécessite la structure suivante
Les spécifications suivantes sont dérivées de documents PHP
Un nom de classe complet doit avoir un espace de noms de niveau supérieur, appelé « espace de noms de fournisseur »
Un nom de classe complet peut avoir un ou plusieurs sous-espaces de noms Un nom de classe complet doit avoir un nom de classe final ;Le trait de soulignement dans n'importe quelle partie du nom complet de la classe n'a aucune signification particulière.
Le nom complet de la classe peut être composé de n'importe quelle lettre majuscule et minuscule.
Tous les noms de classe doivent être sensibles à la casse ;
Ce qui suit est un exemple officiel. Si vous pouvez comprendre cette spécification psr, essayez de la comprendre
1-5 Chargement du fichier de mappage de la bibliothèque de classes
À ce stade, il y aura certainement un question, que se passe-t-il ici ? Il n'y a pas de fichier classmap.php.
Ne vous précipitez pas, ne paniquez pas, exécutez d'abord php think optimise:autoload pour sortir le fichier
Enfin, vous atteindrez la méthode addClassMap Dans cette méthode, vous attribuez simplement les données. du fichier classmap.php dans $classMap est juste, il n'y a pas d'autre utilisation
1-6 Charger automatiquement le répertoire d'extension
extend Ce répertoire a été utilisé par tous ceux qui ont utilisé le framework TP Custom. les classes peuvent être stockées dans ce fichier de bibliothèque de répertoire.
Comme vous pouvez le voir sur l'image ci-dessous, vous utilisez la méthode addAutoLoadDir pour charger
Dans la méthode, vous attribuez uniquement le chemin d'extension à l'attribut $fallbackDirsPsr4.
C'est la fin de la partie Loader::register(); Ensuite, nous examinerons en profondeur l'implémentation interne et les cas pratiques.
Il y a quatre attributs dans le code source de lecture ci-dessus. Organisons-les brièvement
2. Décrivez brièvement le processus de chargement de la classe
Insérez une description d'image ici
Quand je viens de commencer à analyser le code source ici, il y avait une fonction spl_autoload_register
Lorsque la classe à utiliser n'a pas été introduite, cette fonction sera déclenchée avant que PHP ne signale une erreur, et le nom de classe non défini sera transmis comme un paramètre et ira directement ici Exécuter la méthode think\Loader::autoload
La première classe déchargée après le point d'arrêt est thinkError
Pourquoi thinkError! Vous pouvez revenir à thinkphp/base.php et jeter un œil Une fois le chargement automatique terminé, la première classe à exécuter est Error
Vous pouvez simplement faire un test, changer l'Erreur en Kaka, et. imprimez-le. La classe à ce moment-là devient Kaka. À ce stade, tout le monde a une certaine compréhension du mécanisme de chargement automatique de cette classe.
Lorsque la classe utilisée n'a pas été introduite, cette classe sera passée en paramètre à la méthode autoload de thinkphp/library/think/Loader.php.
Venez ici et jetez un œil à la méthode de chargement automatique
Commencez par la méthode findFile et transmettez la classe sans nom dans cette méthode. Dans la méthode findFile, elle sera directement obtenue à partir de l'attribut classMap. .Renvoyer directement le fichier mappé par la classe thinkError
Après avoir renvoyé le chemin complet de la classe thinkError à la variable file d'autoload, le cas de l'environnement win est jugé une fois.
Ensuite, utilisez simplement include pour introduire le fichier jusqu'à son retour.
Jusqu'ici, vous trouverez une analyse complète du chargement automatique de la classe.
Bien que cela se termine ici, je dois quand même mentionner l'attribut $classMap. Cet attribut est basé sur le fichier classmap.php. La génération de ce fichier nécessite également l'exécution de la commande php think optimise:autoload.
Comment le programme s'exécute-t-il lorsque ce fichier n'est pas généré !
Tous les processus précédents sont les mêmes, seul findFile est différent. Trions-le brièvement.
Le code ne passera certainement pas par classMap pour le moment
Récupérez d'abord le fichier thinkError
Ensuite, récupérez l'espace de noms via les deux attributs dans le chargement automatique de Composer, puis fusionnez le fichier thinkError.php
Le résultat final renvoyé est également le fichier D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.php.
Le code ici doit être lu attentivement.
Le chargement automatique des cours est complètement terminé ici.
3. Comment implémenter le chargement automatique des classes avec des fichiers personnalisés
Créez d'abord un dossier kaka
Introduisez ensuite le fichier Kaka.php dans l'index du contrôleur pour un accès direct, cette classe rapportera certainement une erreur, alors que faire pour y accéder directement ?
Insérer la description de l'image ici
À ce moment, l'importance du code source est révélée. N'oubliez pas que dans la fonction de registre chargée automatiquement, le répertoire d'extension a été chargé
Insérer la description de l'image ici
Ceci. j'ai ajouté un répertoire kaka et y ai accédé directement
Pas de problème, il est sorti directement. Tout va bien. Parlons maintenant de la méthode de chargement d'extend
Quand j'ai parlé de l'enregistrement du répertoire de la bibliothèque de classes à chargement automatique, j'ai juste expliqué que j'avais uniquement enregistré le chemin de l'attribut $fallbackDirsPsr4 sans entrer dans les détails. La prochaine étape consiste à les expliquer.
La seule façon de lire le code source est de l'implémenter puis de le visualiser
Insérer la description de l'image ici
Tant que la classe définie est saisie, elle ira au chargement automatique pour un chargement automatique
Il le fera entrez également la méthode findFileVous pouvez voir ce code dans la méthode findFile. Cet attribut vous est familier. Il est ajouté à l'attribut $fallbackDirsPsr4 lorsque le répertoire d'extension est automatiquement chargé.
Regardez les données lors de l'impression de la classe de paramètres dans findFile
Vous pouvez clairement voir la classe testKaka
À ce moment, imprimez le fichier renvoyé dans l'attribut $fallbackDirsPsr4
Ensuite, utilisez __include_file pour inclure directementD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakatestKaka.php le fichier que nous avons défini.
Comment le fichier personnalisé ci-dessus réalise-t-il le chargement automatique des classes, et c'est aussi la méthode de chargement d'extend
(apprentissage recommandé :thinkphp5
)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!