"Cet article instanciera le contrôleur en tant qu'amorce, puis analysera la différence entre ArrayAccess et l'exécution directe de l'accès magique pour renvoyer l'instance
"
Dans ce qui précède, le routage est expliqué en détail, à partir de l'initialisation et de l'analyse de l'application jusqu'à ce que la planification d'itinéraire revienne à la détection d'itinéraire.
La valeur obtenue par la détection d'itinéraire est comme indiqué ci-dessous, qui est la valeur finalement renvoyée par la planification d'itinéraire. Les règles de routage utilisées par
sont Route::get('hello/:name', 'index/index/:name');
Comme le montre la figure ci-dessus, les données importantes sont stockées dans dispatchc. Ensuite, le contrôleur sera expliqué en détail.
La première chose à expliquer est l'opération du contrôleur d'instanciation effectuée une fois la détection d'itinéraire terminée.
Voyons d'abord comment exécuter le contrôleur d'instanciation !
Il ne fait aucun doute que le code doit d'abord être exécuté à partir du fichier d'entrée. Ici, le conteneur est utilisé pour renvoyer une instance d'App, puis la méthode run dans la classe App est appelée.
viendra à l'application d'exécution Dans cette méthode, l'itinéraire qui vient d'être analysé ci-dessus est également .
Ainsi, une fois la route de détection exécutée, le contrôleur instancié sera exécuté.
Une fois la détection de routage exécutée, la classe thinkroutedispatchModule Object
est renvoyée et cette classe est attribuée aux variables$dispatch
Jetez ensuite un œil au code de cette méthode utilisée ici. , les fermetures sont toujours utilisées dans ce code rapide. Si vous n'êtes pas clair sur le concept de fermeture, vous devez revenir à l'essentiel.
L'endroit encerclé dans l'image ci-dessus est le $dispatch->run()
code. Ensuite, nous devons analyser ce code.
Après avoir détecté la valeur de retour finale de l'itinéraire, vous pouvez savoir que cette méthode est en fait dans la classe thinkroutedispatchModule
.
Ensuite, vous devez analyser la méthode d'exécution dans cette classe, qui consiste à effectuer la planification du routage.
Dans cette méthode, ni l'obtention des paramètres de routage, ni la détection du routage, ni la vérification automatique des données ne seront exécutées (l'adresse de routage donnée ci-dessus est utilisée à titre d'exemple).
Donc, selon le code ci-dessus, le code sera exécuté vers $data = $this->exec();
ici.
Le traçage de cette méthode conduira à l'existence d'une classe abstraite dans l'image ci-dessous. Ce que vous devez savoir ici, c'est la classe abstraite.
Explication de la classe abstraite
D'après le principe de la figure ci-dessus, vous pouvez voir que Dispatch
cette classe est une classe abstraite.
Il y aura donc deux situations. La première est que la classe abstraite hérite de la classe abstraite sans hériter de la méthode abstraite de la classe parent.
L'autre est qu'une sous-classe non abstraite hérite d'une classe abstraite et que la sous-classe doit implémenter toutes les méthodes abstraites de la classe parent.
Comment trouver qui a hérité de Dispatch
Y en a-t-il un à ce sujet time ? Une question est de savoir comment trouver la sous-classe de Dispatch.
Vous pouvez voir ce type de Dispatch sur cette image, mais il existe également un répertoire de dispatch.
Sur la base des données renvoyées par la détection d'itinéraire, vous pouvez facilement savoir qu'il s'agit de la classe thinkphp/library/think/route/dispatch/Module.php
.
Venez sur thinkphp/library/think/route/dispatch/Module.php
pour voir la méthode exec
.
Ensuite, la tâche suivante consiste à fournir une explication approfondie de cette méthode.
Regardez d'abord la première ligne de code$this->app['hook']->listen('module_init');
, où le conteneur ArrayAccess utilise un tableau Access l'objet dans le formulaire, puis exécutez la méthode magique __get. Lors de l'accès à un attribut inexistant, la méthode make sera exécutée.
L'utilisation de l'éditeur pour suivre cette application mènera à la classe thinkphp/library/think/route/Dispatch.php
Dans le constructeur de cette classe, vous pouvez voir qu'une instance App est affectée à l'attribut app.
Ensuite, lorsque vous arrivez à la classe App, vous pouvez voir qu'elle hérite la classe Conteneur.
Ce point de connaissance a été mentionné plus d'une fois dans le contexte des conteneurs. Pour accéder à des propriétés inexistantes, revenez en arrière et exécutez la méthode magique __get du conteneur. .
Les paramètres de ce bloc seront donc passés dans le hook et sera renvoyé L'instance de hook, comment cette instance est renvoyée est expliquée en détail dans la section conteneur, vous pouvez y jeter un oeil !
Ensuite, la méthode d'écoute du hook sera exécutée pour surveiller le comportement du hook étiqueter.
À ce stade, vous pouvez accéder au fichier de définition de l'extension du comportement de l'application, et vous pouvez voir que ce paramètre est l'initialisation du module, mais parce que cette valeur est vide.
Il ne sera donc pas exécuté dans l'image ci-dessus, mettez donc la valeur d'initialisation de l'application dans ce paramètre pour un test simple.
Cette classe est le hook d'exécution, qui optimise la classe façade.
puis le code sera exécuté ici $results[$key] = $this->execTag($name, $tag, $params);
.
Description du paramètre
traite ensuite les paramètres transmis via des règles régulières, et renvoie enfin moduleInit
puis renvoie l'instance de behaviorLoadBehavior$obj = Container::get($class);
via
Enfin, la fonction is_callable
est utilisée pour vérifier si la méthode de la classe peut être appelée et le format du tableau de méthodes. Cette méthode sera ensuite utilisée comme objet pour écrire un article séparé. sachez ici que cela retournera false Can.
attribuera alors la valeur de $portal
de cette classe à $method
, et cette valeur est exécutée.
Enfin, la ligne de code $result = $this->app->invoke($call, [$params]);
est transmise. L'exécution inférieure de cette ligne de code est réalisée grâce au mécanisme de réflexion.
Le dernier code renverra NULL.
Instancier le contrôleur
L'étape suivante consiste à instancier le contrôleur. La méthode d'appel est $this->app->controller()
Ce qu'il faut noter ici, c'est la fonction list. Cette fonction renverra un tableau, puis les deux variables de la liste seront respectivement les index 0 et 1. Le jugement
exécutera également le premier, et exécutera également la méthode make de la classe conteneur. Cette méthode renverra directement l'instance de la classe appindexcontrollerIndex
.
Certains amis ont déjà appris à utiliser ArrayAccess et la méthode magique __get.
On estime que certains d'entre eux se trouvent dans des zones ambiguës dans ces deux endroits. Kaka rassemblera ces deux-là et les analysera une fois.
Parlons d'abord de l'utilisation d'ArrayAccess
Ce cas vous a déjà été démontré, principalement pour implémenter la classe ArrayAccess.
Ensuite, lorsque vous arrivez au contrôleur pour l'utiliser, instanciez-le d'abord et implémentez le cas avant comme suit.
Mais le cas qui doit être mis en œuvre cette fois n'est pas celui qui est mis en œuvre dans l'image ci-dessous.
Ensuite, utilisez la méthode indiquée dans la figure ci-dessous pour accéder et utiliser directement la baie pour accéder au propriétés de l'objet.
Comme vous pouvez le voir sur l'image ci-dessus, un attribut title est défini sur kaka. Dans ce cas, il est obtenu directement sous la forme d'un tableau.
Voyez que le résultat renvoyé est kaka, ce qui signifie que les propriétés de l'objet sont directement accessibles sous forme de tableau.
Résumé
Dans le processus de mise en œuvre du premier cas, une étape a été ignorée, qui consiste à utiliser des objets pour utiliser directement des tableaux Le formulaire accède directement aux propriétés de l'objet.
Ce que vous pouvez voir peut être obtenu directement, alors mettons cette idée dans le cadre et jetons un coup d'œil.
Cas pratique du framework
Le code suivant existe dans la route analysée dans l'article précédent. Analysons-le brièvement.
Jetons d'abord un coup d'œil à la valeur de cette application qui est imprimée en tant qu'objet thinkApp Object
.
Lorsque l'objet thinkApp Object
accède à request
, parce que l'attribut app n'a pas ce request
et parce que la classe app hérite de la classe conteneur , il ira donc à la classe conteneur pour exécuter la méthode indiquée ci-dessous.
Ensuite, la méthode __get sera exécutée, et la méthode make sera exécutée pour renvoyer l'instance correspondante .
Si vous avez encore des questions à ce moment-là, pourquoi dit-il simplement cela il sera exécuté ? Il sera mis en œuvre !
Ensuite, Kaka vous fera passer un test simple pour le découvrir.
Imprimez une valeur aléatoire dans cette position.
Ensuite, accédez à la méthode offsetGet d'ArrayAccess de la classe conteneur et imprimez la valeur transmise.
Regardez les résultats imprimés et ce sera clair.
L'utilisation d'ArrayAccess se termine ici. Ceci est également expliqué en détail sur la base de la précédente. Ensuite, la méthode __get dans le conteneur sera expliquée en détail pour voir dans quelles circonstances la méthode __get sera exécutée.
Explication détaillée de l'utilisation de la méthode __get
Pour ce cas, veuillez consulter ceci $this->hook
dans l'image ci-dessous.
Pour la même raison, déboguons d'abord la valeur de ce $this
.
Il n'est pas nécessaire d'imprimer cette valeur, car elle se trouve dans cette classe.
Les attributs de la classe doivent être accessibles, utilisez simplement $this->
directement.
Ainsi, lorsque le système accède à $this->hook
, puisque la classe App n'a pas l'attribut hook, il exécutera la méthode magique de la classe conteneur.
Exécutez ensuite la méthode make pour créer une instance de la classe.
Résumé
Utilisez donc ArrayAccess et La méthode magique __get est finalement exécutée et la méthode make renvoie une instance de la classe.
Lorsque this->config est rencontré, la méthode __get du conteneur est exécutée.
Lorsque vous rencontrez app['request'], exécutez ArrayAccess puis exécutez offsetGet
offsetGet
sera exécutée. 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!