Maison > cadre php > PensezPHP > le corps du texte

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

咔咔
Libérer: 2020-12-04 13:32:23
original
136 Les gens l'ont consulté
"

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

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Lieu imprimé
Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Le résultat de l'impression de détection de routage

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.

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
Le fichier d'entré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é.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Exécuter l'application

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

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Détection d'itinéraire

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.

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

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

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Exécuter la planification d'itinéraire

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.

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

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 ; la classe doit être décorée d'abstrait
  • Les méthodes abstraites ne peuvent pas avoir de 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 des sous-classes
  • Les sous-classes non abstraites héritent des classes abstraites, et les sous-classes doivent implémenter toutes les méthodes abstraites de la classe parent
  • Les sous-classes abstraites héritent des classes abstraites sans hériter des méthodes abstraites de la classe parent

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.

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

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Trouver des sous-classes

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
Instancier le contrôleur

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Recherchez l'instanciation de la classe app

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

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

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
La méthode magique sera exécutée lors de l'accès à des propriétés inexistantes

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 !

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Renvoyer l'instance du hook

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

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Comportement de la balise d'écoute

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

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Appliquez le fichier de définition d'extension de comportement

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

Description du paramètre

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

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.

实例化(分层)控制器 格式:[模块名/]控制器名
Format du contrôleur d'instanciation (en couches) : [nom du module/] nom du contrôleur

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
Il s'agit d'une méthode de test écrite avant

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Utilisez le contrôleur

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Nouvelle visite Visite
Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Imprimer les résultats

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.

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

Regardons d'abord 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
La valeur de l'application imprimée

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.

Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Exécutez cette méthode

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返回实例对象
Exécutez cette méthode pour renvoyer l'objet instance

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.

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

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
Insérer la description de l'image ici
Pensez PHP à la différence entre ArrayAccess et linstance de retour daccès magique direct
Imprimer les résultats

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.

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

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.

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

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
Méthode magique

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
Créer une instance d'une 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

  • __get est pour les attributs de la classe et sera exécuté lorsque les attributs de la classe n'existe pas
  • ArrayAccess Lorsqu'on y accède sous la forme d'un tableau à l'aide d'une classe instanciée, la méthode 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!

Étiquettes associées:
1
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!