咱們已經通過依賴注入的方法解決了對象之間的藕合問題,但仍未從根本上解決問題;
下面我們通過容器技術的講解,讓大家明白這種更加合理優秀的解決方案。
容器其實是一個盒子,里面可以裝任何服務資源:類,類的實例,閉包,函數等,不僅可以將被調用者放在里面,
甚至主調用對象也可以放在里面。所以容器并不神秘,他和我們日??吹降娜萜鞴δ苁且粯拥?就是用來裝東西的。
目前,容器技術已經得到廣泛的應用,眾多的優秀的php開發,都是基于容器技術來實現服務自動加載的。
例如: Laravel, ThinkPHP5.1等等。
容器,也稱服務容器,簡稱(IOC)
基本思想:就是拿來就用,最大限度的簡化外部對象的調用,類似于:[即插即用]的思想
基本實現分三步:
1.創建容器,將類與類的實例化過程綁定到容器中(不局限于類,也可是接口或其它)
2.服務注冊,將可能用到的工具類全部綁定到容器中
3.容器依賴:或者叫依賴容器,調用工作類時直接傳入容器對象即可,工具類的實例化由容器完成
下面是實現的源碼:
?php //數據庫操作類html' target='_blank'>class Db//數據庫連接public function connect()return 數據庫連接成功 br //數據驗證類class Validate//數據驗證public function check()return 數據驗證成功 br //視圖圖class View//內容輸出public function display()return 用戶登錄成功 /******************************************************************************///一.創建容器類class Container//創建屬性,用空數組初始化,該屬性用來保存類與類的實例化方法protected $instance = [];//初始化實例數組,將需要實例化的類,與實例化的方法進行綁定public function bind($abstract, Closure $process)//鍵名為類名,值為實例化的方法$this- instance[$abstract] = $process;//創建類實例public function make($abstract, $params=[])return call_user_func_array($this- instance[$abstract],[]);/******************************************************************************///二、服務綁定: 將類實例注冊到容器中$container = new Container(); //將Db類綁定到容器中$container- bind( db , function(){return new Db();//將Validate類實例綁定到容器中$container- bind( validate , function(){return new Validate();//將View類實例綁定到容器中$container- bind( view , function(){return new View();//測試:查看一下當前容器中的類實例// var_dump($container- instance); die;/******************************************************************************///三、容器依賴:將容器對象,以參數的方式注入到當前工作類中//用戶類:工作類class User//創建三個成員屬性,用來保存本類所依賴的對象// protected $db = null;// protected $validate = null;// protected $view = //這三個與外部對象對應的三個屬性可以全部刪除了,因為它們都已經事先注冊到了容器中//用戶登錄操作// public function login(Db $db, Validate $validate, View $view)//此時,只需從外部注入一個容器對象即可,Db,Validate和View實例方法全部封裝到了容器中public function login(Container $container)//實例化Db類并調用connect()連接數據庫// $db = new Db();// echo $db- connect();echo $container- make( db )- connect();//實例化Validate類并調用check()進行數據驗證// $validate = new Validate();// echo $validate- check();echo $container- make( validate )- check();//實例化視圖類并調用display()顯示運行結果// $view = new View();echo $container- make( view )- display();//在客戶端完成工具類的實例化(即工具類實例化前移)// $db = new Db();// $validate = new Validate();// $view = new View();//現在注入過程就非常簡單了,只需要從外部注入一個容器對象即可//創建User類$user = new User();//調用User對象的login方法進行登錄操作// echo $user- login();// 將該類依賴的外部對象以參數方式注入到當前方法中,當然,推薦以構造器方式注入最方便echo h3 用依賴容器進行解藕: /h3 // echo $user- login($db, $validate, $view);//現在工作類中的login方法不需要再像對象依賴注入那樣寫三個對象了,只需要一個容器對象就可以了echo $user- login($container);
其實,容器模式,還可以用外觀設計模式,進一步進行簡化。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
聊聊框架開發的依賴注入,容器與外觀模式(上部)
以上就是聊聊框架開發的依賴注入,容器與外觀模式(中部)的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答