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