本文將使用倆種設計模式和反射知識實現一個簡單的案例,把之前學習過的知識點進行簡單的融合串聯起來。
經歷了九九八十一難終於來到了容器這一環節,在這一環節我們先來實現一個自己的容器,將之前講解的單例模式、註冊樹模式、反射進行一個串聯,從而進行加深印象和更好的理解。
還記得之前在依賴注入裡邊說過這樣一個方法dependency
,這個方法就是進行了依賴注入,從而對程式碼進行解耦。
但是這次呢!會使用容器來解決這一問題。
首先先把需要的類定義好,這一個類就使用了單例模式和註冊樹模式,之前的文章沒有好好看的,一定要仔細看一下,否則後文會很難理解的。
<?php
/**
* Created by PhpStorm.
* User: 咔咔
* Date: 2020/9/21
* Time: 19:04
*/
namespace container;
class Container
{
/**
* 存放容器
* @var array
*/
public $instances = [];
/**
* 容器的物件範例
* @var array
*/
protected static $instance;
/**
* 定義一個私有的建構函式防止外部類範例化
* Container constructor.
*/
private function __construct() {
}
/**
* 獲取當前容器的範例(單例模式)
* @return array|Container
*/
public static function getInstance ()
{
if(is_null(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
public function set ($key,$value)
{
return $this->instances[$key] = $value;
}
public function get ($key)
{
return $this->instances[$key];
}
}
為了方便以後檢視方便,這裡把每節的案例演示都放在對應的控制器中
這裡把之前的依賴注入的程式碼移植過來,並且設定上註解路由進行存取,看最終結果是否為Car方法返回的123
測試一下列印結果,一切ok
使用單例模式和註冊樹模式配合後修改的這份程式碼
修改後列印出其結果,同樣也是car返回的值123。
在這裡需要注意一下就是在同一個方法中set和get方法是不會共存的,這裡只是為了給大家做一個演示寫到一起的。
後邊在看容器原始碼時就知道set和get方法到底是怎麼使用的,這裡只是讓大家體驗一下單例模式和註冊樹模式。
這裡做一個小修改,修改上文中最後倆行程式碼
堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大網際網路中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。
以上就是ThinkPHP容器之使用設計模式和反射實現一個簡單的案例的詳細內容,更多請關注TW511.COM其它相關文章!