摘要://理解圖//繞來(lái)饒去,借以圖來(lái)理解//face.php <?php //工具類---》實(shí)例化--》放入容器類---》實(shí)例化對(duì)象 //容器類被被外部調(diào)用--》 //導(dǎo)入容器 require 'container.php'; //容器 class Facade { //創(chuàng)建成員屬性保存容器對(duì)象 protected static&nbs
//理解圖
//繞來(lái)饒去,借以圖來(lái)理解
//face.php <?php //工具類---》實(shí)例化--》放入容器類---》實(shí)例化對(duì)象 //容器類被被外部調(diào)用--》 //導(dǎo)入容器 require 'container.php'; //容器 class Facade { //創(chuàng)建成員屬性保存容器對(duì)象 protected static $container = null; //創(chuàng)建初始化方法為容器對(duì)象賦值 public static function initialize(Container $container) { static::$container = $container; } /** * 因?yàn)橐呀?jīng)在初始化方法中將容器對(duì)象導(dǎo)入到了當(dāng)前類中, * 并且保存到了類的靜態(tài)屬性中,為所有類成員所共享, * 所以以下方法可直接調(diào)用不用再容器注入 * 注意:這里全部采用后期靜態(tài)延遲綁定方法來(lái)訪問當(dāng)前容器對(duì)象 * 這主要是為了方便用戶在靜態(tài)繼承的上下文環(huán)境中進(jìn)行調(diào)用 */ //連接數(shù)據(jù)庫(kù) public static function connect($db) { return static::$container->make($db)->connect(); } //用戶數(shù)據(jù)驗(yàn)證 public static function check($validate) { return static::$container->make($validate)->check(); } //輸出提示信息 public static function display($view) { return static::$container->make($view)->display(); } } //初始化類門面類中的容器對(duì)象 Facade::initialize($container); //靜態(tài)統(tǒng)一調(diào)用內(nèi)部的方法(無(wú)須重復(fù)注入依賴容器對(duì)象啦,實(shí)現(xiàn)了細(xì)節(jié)隱藏,通用性更強(qiáng)) echo Facade::connect('db'); echo Facade::check('validate'); echo Facade::display('view');
//container.php
<?php //數(shù)據(jù)庫(kù)操作類 class Db { //數(shù)據(jù)庫(kù)連接 public function connect() { return '數(shù)據(jù)庫(kù)連接成功<br>'; } } //數(shù)據(jù)驗(yàn)證類 class Validate { //數(shù)據(jù)驗(yàn)證 public function check() { return '數(shù)據(jù)驗(yàn)證成功<br>'; } } //視圖圖 class View { //內(nèi)容輸出 public function display() { return '用戶登錄成功'; } } /******************************************************************************/ //一.創(chuàng)建容器類 class Container { //創(chuàng)建屬性,用空數(shù)組初始化,該屬性用來(lái)保存類與類的實(shí)例化方法 public $instance = []; //初始化實(shí)例數(shù)組,將需要實(shí)例化的類,與實(shí)例化的方法進(jìn)行綁定 public function bind($abstract, Closure $process) { //鍵名為類名,值為實(shí)例化的方法 $this->instance[$abstract] = $process; } //創(chuàng)建類實(shí)例 public function make($abstract, $params=[]) { return call_user_func_array($this->instance[$abstract],[]); } } /******************************************************************************/ //二、服務(wù)綁定: 將類實(shí)例注冊(cè)到容器中 $container = new Container(); //將Db類綁定到容器中 $container->bind('db', function(){ return new Db(); }); //將Validate類實(shí)例綁定到容器中 $container->bind('validate', function(){ return new Validate(); }); //將View類實(shí)例綁定到容器中 $container->bind('view', function(){ return new View(); });
//重點(diǎn)是代碼之間的高度復(fù)用,解決后期維護(hù)性
批改老師:天蓬老師批改時(shí)間:2019-02-18 10:55:38
老師總結(jié):依賴注入與容器,簡(jiǎn)單來(lái)講, 就是 把對(duì)象的創(chuàng)建過(guò)程, 全部集中管理,放在容器中, 需要的時(shí)候,直接到容器中取出來(lái)就可以, 千萬(wàn)不要想的太復(fù)雜, 原本這是用來(lái)簡(jiǎn)化開發(fā)的工具, 如果最終使開發(fā)變得復(fù)雜,就沒意義了, 還不如不用它, 你說(shuō)呢?