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

### 依赖注入控制反转的概念 依赖注入(Dependency Injection, DI)是一种设计模式,用于实现控制反转(Inversion of Control, IoC)。IoC 是一种设计理念,在这种理念下,对象不再自己创建所依赖的对象,而是由外部提供这些依赖。这种方式使得组件之间更加松散耦合,提高了代码的可测试性灵活性[^1]。 DI 主要通过三种方式实现:构造函数注入、属性注入以及方法注入。其中最常见的是构造函数注入方法注入。在 Laravel 这样的框架中,可以通过类的构造函数声明依赖关系,并将所需的服务作为参数传入;也可以通过特定的方法接收依赖服务[^2]。 当应用了 DI IoC 后,开发者不需要手动管理各个模块间的实例化过程及其相互间的关系,因为这一切都交给了容器去处理。这样不仅简化了开发流程,还增强了系统的扩展能力[^3]。 ### 使用方法及示例 #### 构造函数注入 这是推荐的方式之一,它确保了一个对象在其生命周期内始终拥有其所需的全部协作对象: ```php class EmailService { protected $mailer; public function __construct(MailerInterface $mailer) { // 注入 Mailer 接口的具体实现 $this->mailer = $mailer; } public function sendEmail($to, $subject, $body){ return $this->mailer->send($to,$subject,$body); } } ``` #### 方法注入 对于某些情况下只需要临时使用的依赖项,则可以采用此形式来进行传递: ```php class ReportGenerator { private $dataStore; public function generateReport(DataStoreInterface $store){ // 在调用时才决定具体的数据存储接口实现 $this->dataStore = $store; // ... 报告生成功能逻辑 ... } } ``` 以上两种方式均体现了如何利用 DI 来构建更灵活的应用程序结构,同时也展示了 IoC 的核心思想——即把原本属于内部的责任转移到外界环境中解决。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值