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