Maison  >  Article  >  cadre php  >  ThinkPHP charge automatiquement l'analyse du code source du Loader

ThinkPHP charge automatiquement l'analyse du code source du Loader

咔咔
咔咔original
2020-09-16 10:22:172402parcourir

Après y avoir longuement réfléchi, j'ai finalement commencé à écrire une série d'articles. J'espère écrire une série d'articles qui pourront gérer les promotions et les interviews. Lorsque vous lisez cet article, si vous trouvez des questions d'entretien brûlantes ou des difficultés techniques que Kaka n'a pas écrites, j'ai hâte de les signaler dans la zone de commentaires et de les améliorer ensemble.

Avant-propos

Nous sommes actuellement en train de trier la feuille de route avancée PHP . Si vous avez de bonnes suggestions, nous les inclurons dès que possible

1. Analyse du code source du chargeur de chargement automatique

1-1 Objectifs d'apprentissage

  • Chargement automatique des classes
  • Deux façons de chargement automatique des classes
  • spl_autoload_register doit pouvoir utiliser
  • pour implémenter le chargement automatique de classes de fichiers personnalisées

1-2 Chargements du compositeur

ThinkPHP charge automatiquement lanalyse du code source du Loader
Insérer la description de l'image ici

Cliquez depuis le image ci-dessus Dans le diagramme d'analyse donné par Ka, la classe de chargement est d'abord chargée dans base.php, puis la méthode de registre est appelée.

ThinkPHP charge automatiquement lanalyse du code source du LoaderEn venant à thinkphplibrarythinkLoader.php il existe une méthode de registre. Dans cette méthode, nous apprenons d'abord le premier point de connaissance spl_autoload_register()Parlons de la vie passée et présente de spl_autoload_register et de son utilisation simple , cliquez directement pour voir.

Vient ensuite le chemin racine du projet et le chemin du compositeur.

ThinkPHP charge automatiquement lanalyse du code source du Loader
Insérer la description de l'image ici

À partir de là, le fichier du compositeur est chargé et le processus est très simple

  • 1. Déterminez si composer est un répertoire
  • 2. Déterminez si autoload_static.php sous le chemin est un fichier
  • 3. Introduisez le fichier autoload_static.php
  • 4. Renvoyez le tableau de toutes les classes déclarées
  • 5. Récupérez la dernière classe ComposerStaticInit30742487e00917c888d89ba216f165b9
  • 6. Déterminez si les données du tableau existent dans ComposerStaticInit30742487e00917c888d89ba216f165b9

Ensuite vous pouvez accéder au fichier suppliercomposerautoload_static.php et vous pouvez le voir Ces deux attributs ThinkPHP charge automatiquement lanalyse du code source du Loader

ThinkPHP charge automatiquement lanalyse du code source du LoaderIl y a un morceau de code ici. On estime que certains étudiants feront le tour self::${$attr} = $composerClass::${$attr}; ici. Le $attr voici les données 'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files', avec un symbole $ ajouté à l'extérieur. couche.

obtient ainsi directement les valeurs d'attribut correspondantes​​dans la classe ComposerStaticInit30742487e00917c888d89ba216f165b9, qui sont les deux valeurs d'attribut dans l'image ci-dessus.

ThinkPHP charge automatiquement lanalyse du code source du Loader
Insérer la description de l'image ici

1-3 Enregistrer l'espace de noms Le

est toujours la méthode thinkphplibrarythinkLoader.php de register

enregistre ici deux espaces de commande, à savoir la pensée et les traits. Ensuite vous entrerez la méthode addNamespace ThinkPHP charge automatiquement lanalyse du code source du LoaderDans la méthode addNamespace, ajoutez Psr4空间

ThinkPHP charge automatiquement lanalyse du code source du LoaderVenez ensuite à la méthode addPsr4, qui enregistrera les deux espaces de noms dans ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中

ThinkPHP charge automatiquement lanalyse du code source du Loader Afin de vérifier ce qui précède, effectuez un débogage de point d'arrêt Lorsque vous voyez ces données, vous. devrait C'est clair, comme pour traits, la méthode d'inscription est la même.

Jusqu'à présent, l'enregistrement de l'espace de noms est terminé. Ensuite, étudions ce qu'est l'espace de noms psr4. ThinkPHP charge automatiquement lanalyse du code source du Loader

1-4 Qu'est-ce que Psr4

psr est simplement compris comme étant le chemin du fichier, automatique Chargez les spécifications pertinentes de la classe correspondante. Actuellement, TP5.1 utilise la spécification psr4

La classe ici fait référence à la structure de classe, d'interface et de super classe

Une classe complète nécessite la structure suivante()*

🎜 >

Les spécifications suivantes proviennent de la documentation PHP
  • Le nom complet de la classe doit avoir un espace de noms de niveau supérieur, appelé « espace de noms du fournisseur »

  • Un ensemble complet ; le nom de classe 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

  • Les noms de classe complets peuvent être composés de n'importe quelle majuscule ; ou des lettres minuscules

  • 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 ThinkPHP charge automatiquement lanalyse du code source du Loader

.

1-5 Charger le fichier de mappage de la bibliothèque de classes

À ce stade, il y aura certainement une question, pourquoi y a-t-il pas de classmap.php ici ? ThinkPHP charge automatiquement lanalyse du code source du LoaderNe vous précipitez pas, ne paniquez pas, exécutez d'abord php think optimize:autoload pour sortir le fichier ThinkPHP charge automatiquement lanalyse du code source du Loader et éventuellement vous atteindrez la méthode addClassMap Dans cette méthode, vous attribuez simplement les données du fichier vers classmap.php , il n'y a pas d'autre utilisation $classMapThinkPHP charge automatiquement lanalyse du code source du Loader

1-6 Charger automatiquement le répertoire d'extension

étendre ce répertoire Tous ceux qui ont utilisé le framework TP l'ont utilisé dans une certaine mesure. Vous pouvez stocker des fichiers de bibliothèque de classes personnalisés dans ce répertoire.

Comme vous pouvez le voir sur l'image ci-dessous, la méthode addAutoLoadDir est utilisée pour le chargement

ThinkPHP charge automatiquement lanalyse du code source du LoaderDans la méthode, le chemin d'extension est uniquement attribué à l'attribut $fallbackDirsPsr4.

ThinkPHP charge automatiquement lanalyse du code source du LoaderC'est tout pour l'instantLoader::register();Cette partie est terminée, revenons ensuite en profondeur sur la mise en œuvre interne et les cas pratiques.

Il y a quatre attributs dans le code source de lecture ci-dessus, organisons-les brièvement

ThinkPHP charge automatiquement lanalyse du code source du Loader
Insérer la description de l'image ici

2. Brève description du processus de chargement des classes

ThinkPHP charge automatiquement lanalyse du code source du Loader
Insérer la description de l'image ici

Il y a une fonction lorsque je viens de commencer à analyser le code source ici 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. Le nom de la classe non défini sera passé en paramètre et la méthode think\Loader::autoload le sera. exécuté directement

ThinkPHP charge automatiquement lanalyse du code source du LoaderLa première classe déchargée après le point d'arrêt est thinkError

ThinkPHP charge automatiquement lanalyse du code source du LoaderPourquoi thinkError ! Vous pouvez revenir sur thinkphp/base.php et jeter un œil. Une fois le chargement automatique terminé, la première classe à exécuter est Error

ThinkPHP charge automatiquement lanalyse du code source du Loader Vous pouvez simplement faire un test et changer l'Erreur en Kaka. et imprimez-le. Après un certain temps, 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'est pas introduite, cette classe sera passée en paramètre à la méthode thinkphp/library/think/Loader.php de autoload.

ThinkPHP charge automatiquement lanalyse du code source du LoaderVenez ici et jetez un œil à la méthode de chargement automatique

ThinkPHP charge automatiquement lanalyse du code source du LoaderCommencez avec la méthode findFile et transmettez la classe sans nom dans cette méthode Dans la méthode findFile La classe thinkError. le fichier de mappage sera renvoyé directement depuis l'attribut classMap

ThinkPHP charge automatiquement lanalyse du code source du Loader Après avoir renvoyé le chemin complet de la classe thinkError à la variable autoload de file, le cas de l'environnement gagnant est jugé une fois.

Utilisez ensuite directement include pour importer le fichier jusqu'à son retour.

Jusqu'ici se trouve une analyse complète du chargement automatique de la classe.

ThinkPHP charge automatiquement lanalyse du code source du LoaderBien 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 Généré. php think optimize: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, sauf qu'ils sont différents ici

Faisons le tri brièvement. findFile

Pour le moment, le code n'ira certainement pas à classMap

ThinkPHP charge automatiquement lanalyse du code source du LoaderRécupérez d'abord le fichier thinkError

ThinkPHP charge automatiquement lanalyse du code source du LoaderEnsuite, récupérez l'espace de noms via les deux attributs lors du chargement automatique de Composer, puis fusionnez le fichier thinkError.php

ThinkPHP charge automatiquement lanalyse du code source du Loader Le résultat final renvoyé est également D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.php ce fichier.

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

ThinkPHP charge automatiquement lanalyse du code source du LoaderÀ ce moment, introduisez le fichier Kaka.php

ThinkPHP charge automatiquement lanalyse du code source du Loader dans l'index du contrôleur pour un accès direct. À ce moment, cette classe signalera certainement une erreur, alors que devons-nous faire. pour y accéder directement ?

ThinkPHP charge automatiquement lanalyse du code source du Loader
Insérer la description de l'image ici

A ce moment, l'importance du code source est révélée, n'oubliez pas de charger la fonction register automatiquement, le répertoire d'extension a été chargé

ThinkPHP charge automatiquement lanalyse du code source du Loader
Insérer la description de l'image ici

À ce moment, ajoutez un répertoire kaka et accédez-y directement. Tous d'un coup

ThinkPHP charge automatiquement lanalyse du code source du Loader il n'y avait rien de mal, c'est sorti directement. Tout va bienThinkPHP charge automatiquement lanalyse du code source du LoaderIci, je vais parler de la méthode de chargement d'extend

Quand j'ai parlé auparavant de l'enregistrement du répertoire de la bibliothèque de classes à chargement automatique, j'ai juste expliqué que je venais d'enregistrer le chemin dans le $fallbackDirsPsr4 attribut sans entrer dans les détails. Continuons ceci est expliqué ci-dessous.

La lecture du code source ne peut se faire qu'en l'implémentant puis en le visualisant

ThinkPHP charge automatiquement lanalyse du code source du Loader
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

La même chose se produira. Entrez la méthode findFile

ThinkPHP charge automatiquement lanalyse du code source du Loader et vous pourrez voir ce code dans la méthode findFile. Cet attribut vous est familier. Il est ajouté à l'attribut $fallbackDirsPsr4 lors de l'extension. Le répertoire est automatiquement chargé.

ThinkPHP charge automatiquement lanalyse du code source du LoaderRegardez les données lors de l'impression de la classe de paramètres dans findFile

Vous pouvez voir clairement testKakacette classe

ThinkPHP charge automatiquement lanalyse du code source du LoaderThinkPHP charge automatiquement lanalyse du code source du LoaderÀ ce stade, imprimez le fichier renvoyé dans l'attribut $fallbackDirsPsr4

ThinkPHP charge automatiquement lanalyse du code source du Loader, puis 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 la méthode de chargement de extend

4. Résumé

Tous les processus concernant le chargement automatique des classes sont terminés. S'il y a des erreurs, veuillez les laisser dans la zone de commentaires !

La persévérance dans l'apprentissage, la persévérance dans les blogs et la persévérance dans le partage sont les convictions auxquelles Kaka adhère depuis sa carrière. J'espère que les articles de Kaka sur l'immense Internet. Je peux vous apporter un peu d'aide Silk. Je m'appelle Kaka, à la prochaine fois.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn