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