php依赖注入和控制反转


依赖注入是一种设计模式,又名 控制反转 ,为了降低耦合度

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();

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值