Maison  >  Article  >  cadre php  >  Pensez PHP à la différence entre ArrayAccess et l'instance de retour d'accès magique direct

Pensez PHP à la différence entre ArrayAccess et l'instance de retour d'accès magique direct

咔咔
咔咔original
2020-12-29 11:31:491652parcourir
"

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

"

Avant-propos

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');

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

1. Contrôleur d'instanciation

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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é.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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).

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Explication de la classe abstraite

  • Les classes abstraites ne peuvent pas être instanciées
  • Une classe avec des méthodes abstraites doit être une classe abstraite ; les classes doivent être décorées avec des méthodes abstraites
  • Méthodes abstraites Là ne peut pas être un corps de fonction ; c'est-à-dire que la fonction abstraite fun();
  • les méthodes non abstraites dans les classes abstraites peuvent être appelées par les sous-classes
  • non abstrait La sous-classe hérite de la classe abstraite. La sous-classe doit implémenter toutes les méthodes abstraites de la classe parent
  • La sous-classe abstraite hérite de la classe abstraite sans hériter des méthodes abstraites de la classe parent.

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Ensuite, lorsque vous arrivez à la classe App, vous pouvez voir qu'elle hérite la classe Conteneur.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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. .

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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 !

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Ensuite, la méthode d'écoute du hook sera exécutée pour surveiller le comportement du hook étiqueter.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

À 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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

puis le code sera exécuté ici $results[$key] = $this->execTag($name, $tag, $params);.

Description du paramètre

  • $name = string(22) "behaviorLoadBehavior"
  • $tag = module_init

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

2. Concernant la différence entre ArrayAccess et exécution directe de l'accès magique pour renvoyer les instances

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Jetons d'abord un coup d'œil à la valeur de cette application qui est imprimée en tant qu'objet thinkApp Object.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Ensuite, la méthode __get sera exécutée, et la méthode make sera exécutée pour renvoyer l'instance correspondante .

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

Exécutez ensuite la méthode make pour créer une instance de la classe.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct

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

  • __get est pour les attributs de la classe. Il sera exécuté lorsque les attributs de la classe n'existent pas.
  • ArrayAccess est utilisé pour accéder au. classe instanciée sous forme de tableau, si elle n'existe pas, la méthode offsetGet sera exécutée.
    Tutoriel recommandé : "thinkphp"

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