❝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.
❞
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
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.
En 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.
À partir de là, le fichier du compositeur est chargé et le processus est très simple
Ensuite vous pouvez accéder au fichier suppliercomposerautoload_static.php et vous pouvez le voir Ces deux attributs
Il 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 correspondantesdans la classe ComposerStaticInit30742487e00917c888d89ba216f165b9
, qui sont les deux valeurs d'attribut dans l'image ci-dessus.
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 Dans la méthode addNamespace
, ajoutez Psr4空间
Venez ensuite à la méthode addPsr4, qui enregistrera les deux espaces de noms dans ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中
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.
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()*
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
.À ce stade, il y aura certainement une question, pourquoi y a-t-il pas de classmap.php ici ? Ne vous précipitez pas, ne paniquez pas, exécutez d'abord php think optimize:autoload
pour sortir le fichier 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 $classMap
Comme vous pouvez le voir sur l'image ci-dessous, la méthode addAutoLoadDir
est utilisée pour le chargement
Dans la méthode, le chemin d'extension est uniquement attribué à l'attribut $fallbackDirsPsr4
.
C'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
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
La première classe déchargée après le point d'arrêt est thinkError
Pourquoi 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
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
.
Venez ici et jetez un œil à la méthode de chargement automatique
Commencez 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
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.
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 Généré. php think optimize:autoload
Faisons le tri brièvement. findFile
Récupérez d'abord le fichier thinkError
Ensuite, récupérez l'espace de noms via les deux attributs lors du chargement automatique de Composer, puis fusionnez le fichier thinkError.php
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.
Créez d'abord un dossier kaka
À ce moment, introduisez le fichier Kaka.php
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 ?
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é
À ce moment, ajoutez un répertoire kaka et accédez-y directement. Tous d'un coup
il n'y avait rien de mal, c'est sorti directement. Tout va bienIci, 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
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
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é.
Regardez les données lors de l'impression de la classe de paramètres dans findFile
Vous pouvez voir clairement testKaka
cette classe
À ce stade, imprimez le fichier renvoyé dans l'attribut $fallbackDirsPsr4
, 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
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!