Maison  >  Article  >  cadre php  >  Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simple

Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simple

咔咔
咔咔original
2020-10-10 11:34:181527parcourir

Cet article utilisera deux modèles de conception et des connaissances de réflexion pour mettre en œuvre un cas simple, et intégrera et reliera simplement les points de connaissances appris auparavant.

5. Une étude de cas sur l'intégration de modèles de conception et de réflexion

Expérimenté quatre-vingt-dix-neuf et quatre-vingts -one La difficulté est finalement venue de la partie conteneur.Dans cette partie, nous avons d'abord implémenté notre propre conteneur, et connecté le mode singleton, le mode arbre d'enregistrement et la réflexion expliqués précédemment en série, afin d'approfondir notre impression et de mieux comprendre. il.

Je me souviens encore d'avoir mentionné une telle méthode dependency dans l'injection de dépendances. Cette méthode consiste à effectuer une injection de dépendances pour découpler le code.

Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simpleMais cette fois ! Des conteneurs seront utilisés pour résoudre ce problème.

Définissez d'abord les classes requises. Cette classe utilise le mode singleton et le mode arbre d'enregistrement. Les articles précédents ne sont pas très bons, alors assurez-vous de les lire attentivement, sinon il sera difficile de comprendre les articles suivants. .

Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simple
Insérer la description de l'image ici

Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simpleLe conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simple

<span style="display: block; background: url(https://my-wechat.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"></span><code class="hljs" style="overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;"><span class="hljs-meta" style="color: #61aeee; line-height: 26px;"><?php</span><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * Created by PhpStorm.<br/> * User: 咔咔<br/> * Date: 2020/9/21<br/> * Time: 19:04<br/> */</span><br/><br/><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">namespace</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">container</span>;<br/><br/><br/><span class="hljs-class" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">class</span> <span class="hljs-title" style="color: #e6c07b; line-height: 26px;">Container</span><br/></span>{<br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * 存放容器<br/>     * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@var</span> array<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> $instances = [];<br/><br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * 容器的对象实例<br/>     * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@var</span> array<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">protected</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">static</span> $instance;<br/><br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * 定义一个私有的构造函数防止外部类实例化<br/>     * Container constructor.<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">private</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">__construct</span><span class="hljs-params" style="line-height: 26px;">()</span> </span>{<br/><br/>    }<br/><br/>    <span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/>     * 获取当前容器的实例(单例模式)<br/>     * <span class="hljs-doctag" style="color: #c678dd; line-height: 26px;">@return</span> array|Container<br/>     */</span><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">static</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">getInstance</span> <span class="hljs-params" style="line-height: 26px;">()</span><br/>    </span>{<br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">if</span>(is_null(<span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance)){<br/>            <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance = <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">new</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>();<br/>        }<br/><br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">self</span>::$instance;<br/>    }<br/><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">set</span> <span class="hljs-params" style="line-height: 26px;">($key,$value)</span><br/>    </span>{<br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->instances[$key] = $value;<br/>    }<br/><br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">public</span> <span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">get</span> <span class="hljs-params" style="line-height: 26px;">($key)</span><br/>    </span>{<br/>        <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">$this</span>->instances[$key];<br/>    }<br/>}<br/></code>

Pour faciliter la visualisation future, voici les démonstrations de cas de chaque section Placez-le dans le contrôleur correspondant

Ici transplantez le code d'injection de dépendance précédent et configurez le routage des annotations pour l'accès pour voir si le résultat final est 123 renvoyé par la méthode Car

Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simpleTestez l'impression résultat, tout va bien

Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simpleCe code a été modifié en utilisant le mode singleton et le mode arbre d'enregistrement

Après modification, le résultat est imprimé, qui est également renvoyé par la voiture Valeur 123.

Il convient de noter ici que les méthodes set et get ne coexisteront pas dans la même méthode. Elles sont écrites ensemble juste pour vous faire une démonstration.

Lorsque vous examinerez le code source du conteneur plus tard, vous saurez comment utiliser les méthodes set et get. Ici, nous vous laissons simplement expérimenter le mode singleton et le mode arbre d'enregistrement.

Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simpleFaites une petite modification ici, modifiez les deux dernières lignes de code ci-dessus

Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simple
Insérer la description de l'image ici
Le conteneur ThinkPHP utilise des modèles de conception et une réflexion pour implémenter un cas simple
Insérer la description de l'image ici

Continuer à apprendre et persister Écrire des blogs et insister sur le partage sont les convictions auxquelles Kaka a toujours adhéré depuis ses débuts. J'espère que les articles de Kaka sur le grand Internet pourront vous apporter un peu d'aide. 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!

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