abstrait:以用戶登錄案例為例,工作類調用三個基本的工具類會出現嚴重藕合現象,一旦工具類發(fā)生變化,工作類就必須對應的更改設置;對工具類的實例化不要在工作類中完成,在(類或函數之外完成)客戶端完成,這樣必須在工作類中必須要有一個接收器來保存工具類的實例,將工作類依賴的對象以方法參數的方式植入到當前的類中,叫依賴注入。但依賴注入還是要在工作類的客戶端進行實例化,怎么能去掉實例化?給出一個類名以及如何去實例化衍生出
以用戶登錄案例為例,工作類調用三個基本的工具類會出現嚴重藕合現象,一旦工具類發(fā)生變化,工作類就必須對應的更改設置;對工具類的實例化不要在工作類中完成,在(類或函數之外完成)客戶端完成,這樣必須在工作類中必須要有一個接收器來保存工具類的實例,將工作類依賴的對象以方法參數的方式植入到當前的類中,叫依賴注入。但依賴注入還是要在工作類的客戶端進行實例化,怎么能去掉實例化?給出一個類名以及如何去實例化衍生出來了容器注入。
代碼實現,創(chuàng)建三個工具類
class Db
{
public function connect()
{
return 'Db連接成功<br>';
}
}
class Validate
{
public function check()
{
return '數據驗證成功<br>';
}
}
class View
{
public function display()
{
return '用戶登錄成功<br>';
}
}
容器注入基本步驟:
1,創(chuàng)建容器:將一個類和他的關聯實現綁定到一個關聯數組中
class Container
{
//創(chuàng)建一個空數組用來保存工具類及實現方法
// protected $instance = []; //創(chuàng)建一個屬性
public $instance = [];
// $instance['類名'] = '類的實例化過程\函數';
//將需要實例化的類和它的實現方法進行綁定:降對象容器進行初始化
public function bind($abstract,Closure $process)
{
$this->instance[$abstract] = $process;
// $this->instance['db'] = function(){
// return new Db('locahost','root','root');
}
//創(chuàng)建特定類的實例
public function make($abstract,$params=[])
{
return call_user_func_array($this->instance[$abstract],[]);
}
}
2,服務注冊:初始化這個關聯數組,將工具類綁定到容器中
//2,服務注冊:其實就是調用容器的bind方法,將對象注冊到容器中
$container = new Container();
//將Db類綁定到容器中
$container->bind('db',function(){
return new Db();
});
$container->bind('validate',function(){
return new Validate();
});
$container->bind('view',function(){
return new View();
});
3,容器依賴:也叫依賴容器,調用的時候直接傳一個容器對象即可
// 用戶類:工作類
class User
{
public function login(Container $container)
{
//$container->make('db'):實例化Db類創(chuàng)建$db對象
echo $container->make('db')->connect();
echo $container->make('validate')->check();
echo $container->make('view')->display();
}
}
$user = new User();
echo '<h3>用依賴容器來實現解藕</h3>';
echo $user->login($container);
門面Facade:
思想:將一些操作進行封裝,對外提供統(tǒng)一接口進行訪問,跟網址大全hao123差不多,
Facade類實現三個功能:1,連接數據庫; 2,數據驗證;3,輸出提示
require 'container.php';
class Facade
{
//創(chuàng)建一個靜態(tài)屬性保存容器對象
protected static $container = null;
//創(chuàng)建一個初始化方法,給容器對象賦值
public static function initialize(Container $container)
{
static::$container = $container;
}
//1,連接數據庫
public static function connect()
{
return static::$container->make('db')->connect();
}
//2,數據驗證
public static function check()
{
return static::$container->make('validate')->check();
}
//3,輸出提示
public static function display()
{
return static::$container->make('view')->display();
}
}
//客戶端調用
echo '<h3>簡化后的Facade門面統(tǒng)一調用:</h3>';
Facade::initialize($container);//初始化
echo Facade::connect($container);
echo Facade::check($container);
echo Facade::display($container);
Professeur correcteur:查無此人Temps de correction:2019-03-02 13:33:15
Résumé du professeur:完成的不錯。對外提供接口,也要做好加密,防止別人攻擊服務器,繼續(xù)加油。