ThinkPHP容器之使用設計模式和反射實現一個簡單的案例

本文將使用倆種設計模式和反射知識實現一個簡單的案例,把之前學習過的知識點進行簡單的融合串聯起來。

五、融合設計模式和反射實現一個案例

經歷了九九八十一難終于來到了容器這一環節,在這一環節我們先來實現一個自己的容器,將之前講解的單例模式、注冊樹模式、反射進行一個串聯,從而進行加深印象和更好的理解。

還記得之前在依賴注入里邊說過這樣一個方法dependency,這個方法就是進行了依賴注入,從而對代碼進行解耦。

ThinkPHP容器之使用設計模式和反射實現一個簡單的案例但是這次呢!會使用容器來解決這一問題。

首先先把需要的類定義好,這一個類就使用了單例模式和注冊樹模式,之前的文章沒有好好看的,一定要仔細看一下,否則后文會很難理解的。

ThinkPHP容器之使用設計模式和反射實現一個簡單的案例
在這里插入圖片描述

ThinkPHP容器之使用設計模式和反射實現一個簡單的案例ThinkPHP容器之使用設計模式和反射實現一個簡單的案例

<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><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>-&gt;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>-&gt;instances[$key];<br>????}<br>}<br></span>

為了方便以后查看方便,這里把每節的案例演示都放在對應的控制器中

這里把之前的依賴注入的代碼移植過來,并且配置上注解路由進行訪問,看最終結果是否為Car方法返回的123

ThinkPHP容器之使用設計模式和反射實現一個簡單的案例測試一下打印結果,一切ok

ThinkPHP容器之使用設計模式和反射實現一個簡單的案例使用單例模式和注冊樹模式配合后修改的這份代碼

修改后打印出其結果,同樣也是car返回的值123。

在這里需要注意一下就是在同一個方法中set和get方法是不會共存的,這里只是為了給大家做一個演示寫到一起的。

后邊在看容器源碼時就知道set和get方法到底是怎么使用的,這里只是讓大家體驗一下單例模式和注冊樹模式。

ThinkPHP容器之使用設計模式和反射實現一個簡單的案例這里做一個小修改,修改上文中最后倆行代碼

ThinkPHP容器之使用設計模式和反射實現一個簡單的案例
在這里插入圖片描述
ThinkPHP容器之使用設計模式和反射實現一個簡單的案例
在這里插入圖片描述

堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享