"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 l'article ci-dessus, le routage est expliqué en détail, à partir de l'initialisation de l'application et de l'analyse de tous la manière de planifier le routage. Revenez au lien de détection de routage.
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.
La règle de routage utilisée est Route::get('hello/:name', 'index/index/:name');
Comme vous pouvez le voir sur l'image ci-dessus, les données importantes sont stockées dans dispatchc. Le contrôleur sera expliqué en détail ci-dessous.
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, la route qui vient d'être analysée ci-dessus est également utilisée.
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 affectée à la variable $dispatch
Ensuite, jetez un œil au code de cette méthode qui est utilisée ici, et les fermetures sont toujours utilisées dans ce code rapide. vous n'êtes pas clair sur la notion de clôture, vous devez revenir à l'essentiel.
L'endroit encerclé dans l'image ci-dessus est le $dispatch->run()
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é $data = $this->exec();
ici.
Le traçage de cette méthode mènera à 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
Selon 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
Avez-vous une question en ce moment ? 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 la première ligne de code $this->app['hook']->listen('module_init');
Ici le conteneur ArrayAccess est utilisé pour accéder à l'objet sous la forme d'un. array, puis exécutez La méthode magique __get exécutera la méthode make lors de l'accès à un attribut inexistant.
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 de la classe Container.
J'ai parlé de ce point de connaissance plus d'une fois dans la zone conteneur. Pour accéder aux 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 l'instance du hook sera renvoyé. À propos de cela La façon dont l'instance est renvoyée est expliquée en détail dans la section conteneur, vous pouvez la vérifier !
Ensuite, la méthode d'écoute du hook sera exécutée pour surveiller le comportement de la balise.
À 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 initialisé pour le 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é à $results[$key] = $this->execTag($name, $tag, $params);
ici.
Description du paramètre
traite ensuite les paramètres transmis via des expressions régulières, et renvoie enfin moduleInit
puis renvoie l'instance de behaviorLoadBehavior via $obj = Container::get($class);
passe enfin le is_callable
fonction Vérifier, vérifier si la méthode de la classe peut être appelée, format de tableau de méthodes, cette méthode sera écrite plus tard dans un article séparé en tant qu'objet à analyser, ici il vous suffit de savoir que false sera renvoyé.
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.
Contrôleur d'instance
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. Après cette fonction, un tableau sera renvoyé, puis les deux. les 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. Le cas précédemment implémenté est le suivant.
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 illustrée dans la figure ci-dessous pour accéder directement aux propriétés de l'objet à l'aide d'un tableau.
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 d'implémentation du premier cas, une étape a été ignorée, qui consiste à utiliser l'objet pour accéder directement aux propriétés de l'objet sous forme de tableau.
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.
Regardons d'abord 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, elle 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 qu'elle sera exécutée et qu'elle le sera être exécuté!
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.
C'est tout pour l'utilisation d'ArrayAccess C'est Il s'agit également d'une explication détaillée basée sur la précédente. Ensuite, nous expliquerons en détail la méthode __get dans le conteneur 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 le $this->hook
dans l'image ci-dessous.
Pour la même raison, déboguons d'abord la valeur de ceci $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é
Nous utilisons donc les méthodes magiques ArrayAccess et __get, et finalement la méthode make exécutée renvoie une instance de la classe.
Lorsque this->config est rencontré, la méthode __get du conteneur est exécutée.
Lorsqu'il rencontre app['request'], il exécute ArrayAccess puis exécute offsetGet
offsetGet
sera exécutée si elle n'existe pas. 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!