依赖注入是一种设计模式,又名 控制反转 ,为了降低耦合度
1:控制反转(Inversion of Control )的实现方式
简称:IOC
理解:A类不需要主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。比如说,A类中需要用到C类,也可能是B类,而这时候,不需要再A类内部代码中去实例化C类或者B类,这样代码耦合性太高,不容易维护,为了降低耦合度,从而设计成A类中传递一个参数,而这个参数就是B类或者C类。
/ 定义写日志的接口规范
interface logApi {
public function write();
}
// 文件记录日志
class FileLog implements logApi {
public function write() {
echo 'file log write...';
}
}
// 数据库记录日志
class DatabaseLog implements logApi {
public function write() {
echo 'database log write...';
}
}
// 程序操作类
class User {
protected $fileLog;
public function __construct() {
$this->fileLog = new FileLog();
}
public function login() {
// 登录成功,记录登录日志
echo 'login success...';
$this->fileLog->write();
}
}
$user = new User();
$result = $user -> login();
代码这样写,耦合度高,如果将user类改成一下形式:
// 程序操作类
class User {
protected $fileLog;
public function __construct(Log $log) {
$this->fileLog = $log;
}
public function login() {
// 登录成功,记录登录日志
echo 'login success...';
$this->fileLog->write();
}
}
$user = new User(new FileLog());
$result = $user -> login();
这样想用任何方式记录操作日志都不需要去修改过User类了,只需要通过构造函数参数传递就可以实现,其实这就是“控制反转”。不需要自己内容修改,改成由外部外部传递。这种由外部负责其依赖需求的行为,我们可以称其为 “控制反转(IoC)
2:依赖注入
特点:
创建一个容易类,将用到的其他的类进行绑定到这个容器中,然后随时可以取用。
class luntai {
public function luntai1(){
echo "这是luntai.<br/>";
}
}
class bmn {
private $luntaiClass;
public function __construct($luntai){
$this->luntaiClass = $luntai;
}
public function bmn(){
$this->luntaiClass->luntai1();
echo "这是bmn.<br/>";
}
}
class Container {
static $register;
public static function bind($name,Closure $clo){
self::$register[$name] = $clo;
}
public static function make($name){
$clo = self::$register[$name];
return $clo();
}
}
Container::bind('luntai',function(){
return new luntai();
});
Container::bind('bmn',function(){
return new bmn(Container::make('luntai'));
});
$bmn = Container::make('bmn');
$bmn->bmn();