«Cet article décrit principalement le processus d'utilisation et de mise en œuvre de la façade, et analyse le code source.
»
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.
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é.
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.
Ici, 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
.
Comment 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.
Faites 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.
Imprimez le résultat, le résultat est celui que nous attendions.
Alors 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
Pourquoi 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.
Créez ensuite une nouvelle classe Sessions dans le répertoire Facade et héritez de Facade. Ensuite, écrivez le contenu.
À 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
.
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.
Cré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.
À 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.
Il 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.
Test
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.
Avez-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.
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
l'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 !
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.
Ensuite, la createFacade
mé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.
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.
tester le code source
Code source du test1
Appels du contrôleur
Imprimer les résultatsÊ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
Imprimez les résultats
Je 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.
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.
Le 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 valeursde 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!