Maison  >  Article  >  cadre php  >  Analyse du code source de la façade ThinkPHP

Analyse du code source de la façade ThinkPHP

咔咔
咔咔original
2020-11-05 12:02:372167parcourir
«

Cet article décrit principalement le processus d'utilisation et de mise en œuvre de la façade, et analyse le code source.

»

Avant-propos

Les partenaires qui utilisent le framework doivent savoir qu'en 5.1, le framework a ajouté une nouvelle fonctionnalité, qui est la façade que ce l'article écrira, c'est-à-dire un élément de façade.

Tous ceux qui ont utilisé cette fonctionnalité en comprennent l'avantage, c'est-à-dire que les appels de méthode peuvent être directement appelés de manière statique, sans utiliser le mot-clé static pour définir.

Ensuite, Kaka vous emmènera explorer l'histoire de la façade sous les aspects suivants.

1. Comprenez brièvement les avantages de la façade dans le cadre

J'ai déjà écrit sur le chargement des fichiers de configuration. Un article, à la fin de cet article, mentionnait plusieurs façons d'obtenir des informations de configuration.

L'une des méthodes est Config::get(). Par cet article, vous devez savoir que lorsque vous utilisez Config pour obtenir des informations de configuration, vous devez d'abord introduire use thinkfacadeConfig, et parce qu'un alias est enregistré dans le fichier. système, utilisez simplement use Config directement.

Bien que nous utilisions use thinkfacadeConfig, la méthode réelle appelée est la méthode thinkphp/library/think/Facade.php dans __callStatic.

exécutera alors la méthode createFacade du même fichier.

Bien que je n'aie pas encore regardé le code source, il sera bon à savoir lors de l'appel de la méthode createFacade, elle est obtenue directement à partir de la classe conteneur.

Lors de l'apprentissage des conteneurs, nous savons tous que les conteneurs utilisent le mode arbre d'enregistrement. Lorsque vous devez utiliser l'instance d'objet correspondante, vous pouvez l'obtenir directement, évitant ainsi la création répétée d'une classe. C'est l'un des avantages. Utiliser les fonctionnalités du conteneur

Pour l'utilisation précédente de config, vous devez utiliser l'espace de noms de config puis l'instancier avant de l'appeler.

Si l'utilisation de la configuration n'est pas autorisée pour le moment, vous devez utiliser la classe de configuration que vous avez créée. Si vous n'utilisez pas le mode façade, vous devez modifier beaucoup de code, et c'est global. .

Mais si vous utilisez le mode façade dans le framework, il vous suffit de réécrire la méthode getFacadeClass Il vous suffit de modifier le résultat renvoyé ou de le définir vous-même, car pour les autres fichiers lors de l'appel, ils ne le font pas. Peu importe ce que l'instance appelle, ils ne se soucient que du nom de la méthode et du résultat renvoyé.

2. L'utilisation de façade dans le cadre d'apprentissage

Créez d'abord une façade de contrôleur et écrivez le contenu suivant .

Ici, nous utilisons simplement la méthode de la façade pour obtenir les informations du fichier de configuration.

Analyse du code source de la façade ThinkPHPIci, vous pouvez voir que use Config est utilisé, qui est l'alias de la classe de configuration.

Les paramètres d'alias sont définis dans base.php.

Analyse du code source de la façade ThinkPHPComment utiliser correctement la façade dans le cadre !

Créez un nouveau dossier façade dans le répertoire de l'application pour stocker spécifiquement les classes de façade.

Une classe Sessions est créée ici.

Analyse du code source de la façade ThinkPHPFaites d'abord un test pour vérifier s'il y a un problème avec le code. Testez dans le fichier façade du contrôleur.

Voici comment cela est géré lorsque la façade n'est pas utilisée. Vous devez introduire la classe correspondante, puis l'instancier, puis utiliser la classe instanciée pour effectuer des appels de méthode.

Analyse du code source de la façade ThinkPHPImprimez le résultat, le résultat est celui que nous attendions.

Analyse du code source de la façade ThinkPHPAlors comment changer ce code en mode façade ! Suivez les traces de Kaka étape par étape.

Créez d'abord deux répertoires dans le répertoire kaka, à savoir façade et util

Analyse du code source de la façade ThinkPHPPourquoi créer ces deux dossiers ! Tout le monde doit savoir que util est une classe d'outils. Ce type de fichier de classe peut être partagé dans d'autres projets.

C'est-à-dire que nous n'avons besoin d'implémenter qu'une seule copie, puis de l'utiliser directement lorsque nous l'utilisons dans d'autres projets.

Vous pouvez donc copier le fichier directement dans le répertoire util, n'oubliez pas de modifier l'espace de noms.

Analyse du code source de la façade ThinkPHPCréez ensuite une nouvelle classe Sessions dans le répertoire Facade et héritez de Facade. Ensuite, écrivez le contenu.

Analyse du code source de la façade ThinkPHPÀ ce stade, nous arrivons au contrôleur pour le tester.

Vous constaterez que le résultat est le même qu'avant, mais la différence évidente est qu'après avoir utilisé le mode façade, vous pouvez directement utiliser la méthode statique pour appeler.

Vous souvenez-vous encore d'un des avantages de la façade que j'ai évoqués précédemment ?

En supposant que cette classe d'outils Sessions cessera d'être utilisée à l'avenir, il suffit alors de modifier le contenu de la méthode getFacadeClass.

Analyse du code source de la façade ThinkPHPAnalyse du code source de la façade ThinkPHP

3. Optimiser l'utilisation de façade dans la charpente

Dans ce qui précède, nous avons implémenté la même fonction depuis l'instanciation de la classe jusqu'à l'utilisation de la méthode façade.

Bien que l'effet souhaité soit affiché, le code n'est toujours pas assez concis et beau, et la structure est relativement déroutante.

Ensuite, Kaka vous proposera un plan réalisable. Si vous avez d'autres projets, vous pouvez les proposer ! Rendez-vous dans la section commentaires.

Dans les travaux de développement normaux, il est impossible d'avoir une seule ou quelques classes de façades personnalisées. Dans les projets complexes, il y aura plusieurs classes de façades.

Comme il y en a beaucoup, il faut les gérer.

Analyse du code source de la façade ThinkPHPCréez d'abord une classe de configuration appartenant à la façade.

Mappez la classe proxy avec la classe réelle, puis définissez l'alias.

Analyse du code source de la façade ThinkPHPÀ ce stade, vous devez créer un fichier hook et y placer l'enregistrement de la classe de façade et l'enregistrement du nom de la catégorie de façade pour exécution.

Analyse du code source de la façade ThinkPHPIl y a la dernière étape, qui est que le fichier hook est créé mais pas exécuté.

Alors, quand le fichier hook doit-il être exécuté ? C'est-à-dire le charger lorsque l'application est initialisée.

La configuration d'initialisation appliquée dans TP5.1 se trouve dans le fichier application/tags.php.

Configurez simplement le fichier hook dans l'élément de configuration d'initialisation de l'application.

Analyse du code source de la façade ThinkPHPTest

La dernière étape consiste à tester, exécutez toujours la méthode application/index/controller/Facade.php dans le fichier getUserInfo.

D'après les résultats des tests, nous pouvons savoir qu'il n'y a aucun problème pour écrire le code de notre solution.

Analyse du code source de la façade ThinkPHPAnalyse du code source de la façade ThinkPHPAvez-vous trouvé un problème ici, c'est-à-dire que puisque l'alias de la classe façade est défini dans le hook, il n'est pas utilisé ici.

Ensuite, nous utilisons des alias pour le tester.

Analyse du code source de la façade ThinkPHPAnalyse du code source de la façade ThinkPHP

4. Analyse du code source de la classe Facade

Avant d'analyser la source code Connaître deux méthodes.

  • __callStatic : Cette méthode est appelée lors de l'accès à une méthode statique inexistante.
  • call_user_func_array : Vous pouvez utiliser cette fonction pour appeler la fonction directement.

Nous commençons par obtenir le fichier de configuration et analyser

Analyse du code source de la façade ThinkPHPl'exécution de Config::get('facade.'); sera exécutée dans le fichier thinkphp/library/think/facade/Config.php.

est comme mentionné précédemment dans ce fichier. Si la méthode getFacadeClass existe, elle renverra directement l'alias correspondant.

S'il n'existe pas, vous devez utiliser la méthode bind pour lier la façade.

Si vous ne comprenez pas ici, il faut aller dans la documentation et lire le chapitre sur la façade !

Analyse du code source de la façade ThinkPHP Il n'y a pas de méthode get dans la classe ci-dessus, donc la méthode thinkphp/library/think/Facade.php dans le fichier __callStatic sera appelée directement.

Cette méthode est directement expliquée au début de l'article. Cette méthode sera appelée lors de l'accès à une méthode statique inexistante.

Analyse du code source de la façade ThinkPHPEnsuite, la createFacademéthode de cette classe sera exécutée

Il y a une ligne de code dans cette méthode qui ressemble à ceci$facadeClass = static::getFacadeClass();Ce code sera détaillé ci-dessous la description .

Parce qu'il y a les mêmes méthodes dans les sous-classes et les mêmes méthodes dans cette classe, mais les méthodes de cette classe n'ont aucune valeur de retour.

Êtes-vous un peu confus en ce moment quant à la méthode que le statique utilisé ici exécutera ? Ou pensez-y de cette façon, pourquoi la méthode de sous-classe est exécutée.

Conservez ces questions et nous vous les expliquerons en détail ci-dessous. Lisons d'abord le code source de la classe façade.

Dans cette méthode, regardez principalement les quelques endroits que j'ai encerclés.

La première chose est d'obtenir l'alias de la classe à partir de la méthode getFacadeClass de la sous-classe.

Le deuxième point est que lorsque la sous-classe n'a pas de méthode getFacadeClass, elle est obtenue à partir de la propriété liée manuellement.

Le troisième endroit est le conteneur mentionné dans l'article précédent. Je ne l'expliquerai pas en détail ici. Si vous ne savez pas comment faire, cliquez sur la page d'accueil pour lire l'article précédent.

Analyse du code source de la façade ThinkPHP
Méthode createFacade

5. Mot-clé statique

en I. Je dois expliquer le mot-clé static ici.

Les nouveaux apprenants savent probablement seulement que static est utilisé pour définir des variables statiques et des méthodes statiques.

Bien sûr, je ne vous expliquerai pas ici comment définir des méthodes statiques et des variables statiques, mais je parlerai d'un très, très petit détail.

Regardons d'abord un exemple. Cet exemple a également été adapté par Kaka sur la base du code source de la façade lors de la lecture du code source de la façade.

Kaka a créé ici deux nouveaux fichiers, à savoir test et test1.

test hérite du fichier test1, et les deux ont la même méthode getKaka.

Analyse du code source de la façade ThinkPHP
Créer deux nouveaux fichiers

tester le code source

Analyse du code source de la façade ThinkPHP
tester le code source

Code source du test1

Analyse du code source de la façade ThinkPHPAppels du contrôleur

Analyse du code source de la façade ThinkPHPImprimer les résultatsAnalyse du code source de la façade ThinkPHPÊtes-vous un peu confus en ce moment, pourquoi 147 est-il imprimé ici au lieu de 456 ?

Modifiez le code de test1 et changez static en self

Analyse du code source de la façade ThinkPHPImprimez les résultats

Analyse du code source de la façade ThinkPHPJe crois que tout le monde peut lire le code en utilisant self, je comprends, alors pourquoi est-ce que j'obtiens des résultats qui peuvent ne pas être clairs en utilisant statique !

À ce stade, le document commence à prendre effet, mais lorsque vous ouvrez le document PHP, vous constaterez qu'il n'y a aucune explication de cette situation dans l'article statique.

Après de nombreux tests et examen des données par Kaka, les résultats récapitulatifs finaux sont les suivants.

static::$test S'il est hérité, il appellera la sous-classe par défaut, sinon il s'appellera

self::$test S'il est hérité, il appellera cette classe par défaut

Pour illustrer dans cet exemple, lorsque test hérite de test1.

Lorsque vous utilisez static pour appeler la méthode getKaka dans test1, la méthode par défaut est getKaka dans la classe de test, qui est la méthode de la sous-classe.

Lorsque vous utilisez self pour appeler la méthode getKaka dans test1, la méthode par défaut est getKaka dans la classe test1, qui est la méthode de cette classe.

Ce petit détail a également été découvert accidentellement par Kaka. S'il y a quelque chose qui ne va pas, vous pouvez le signaler et Kaka apportera des modifications.

Parce qu'il existe une autre situation en matière d'héritage, Kaka effectuera des tests en privé et ne l'expliquera pas ici.

L'explication de cette statique ici consiste principalement à expliquer cette ligne de code dans le fichier thinkphp/library/think/Facade.php.

Étant donné que la méthode appelée par cette ligne de code existe à la fois dans la sous-classe et dans la classe parent, Kaka l'écrira pour donner une brève introduction afin de ne pas confondre tout le monde.

Analyse du code source de la façade ThinkPHP
thinkphp/library/think/Facade.php

Résumé

Jetons d'abord un coup d'œil à l'organigramme des façades, afin que vous puissiez voir plus clairement le processus d'exécution spécifique de la classe de façade.

Analyse du code source de la façade ThinkPHPLe code source de la classe façade est très simple, à l'exception de quelques points de connaissances peu courants, je pense que le code peut être clairement compris.

Il s'agit principalement de faire un petit résumé après avoir lu la catégorie façade.

La classe façade est principalement une fonction implémentée en combinaison avec le conteneur, car le conteneur est nécessaire pour renvoyer l'instance correspondante. L'article sur le conteneur est également terminé. Si vous n'avez aucune connaissance sur le conteneur, vous pouvez le lire au début de l'article.

Cet article explique comment utiliser la façade dans le conteneur et vous propose la manière optimale de l'utiliser. La manière optimale ici est l'opinion personnelle de Kaka, car Kaka utilise cette méthode pendant près de deux ans.

C'est très pratique en termes de robustesse et d'évolutivité du code.

Ensuite, à propos du mot-clé static, j'aimerais ajouter quelques connaissances impopulaires à tout le monde. Lorsqu'une classe hérite d'une classe, lorsque le mot-clé static est utilisé dans la classe parent, la méthode de la sous-classe est appelée par défaut. .

Le résumé ici concerne uniquement les exemples de cet article.

En fait, Kaka veut aussi vous expliquer un point ici, qui est return call_user_func_array([static::createFacade(), $method], $params);

Parce que dans l'usage précédent, les paramètres étaient directement des méthodes, mais ici nous avons rencontré la forme de tableau, alors Que représentent les deux valeurs​​de ce tableau ?

La première valeur est l'instance et la deuxième valeur est la méthode dans l'instance.

Concernant l'utilisation de call_user_func_array cette méthode, KaKa ne fera pas de cas à vous montrer, il vous suffit de savoir qu'il exécutera la méthode entrante.

Cela termine l'analyse du code source de la façade. Le plus important est de comprendre le conteneur, car la façade est implémentée sur la base du conteneur. C'est pourquoi Kaka écrit d'abord le conteneur puis écrit le. façade.

De plus, Kaka a également donné un plan d'utilisation de la façade. Si vous avez un meilleur plan, vous pouvez donner une idée générale dans la zone commentaire.

«

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 a toujours adhéré depuis sa carrière. J'espère que les articles de Kaka dans 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