本文最后更新时间超过30天,内容可能已经失效。
参考文献:http://blog.kaiot.xyz/read/60.html
把有依赖关系的类放进容器中,解析出这些类的实例,就是依赖注入,目的是实现类的解耦。
实例:Class A中用到了Class B的对象 bObject,普通情况下,需要在类A的代码中显示的new出一个B的对象。采用依赖注入后,A的代码只需要定义一个私有的B对象,不需要直接new 来获取这个对象,而是通过相关容器控制程序来将B的对象在外部new出来并注入到A类的引用中。
示例代码:
<?php
class A{
protected $info;
// $b 为实例化的b
public function __construct($b){
$this->info = $b;
}
public function a(){
// 直接调用b中的方法
return $this->info->b();
}
}
class B{
public function __construct(){
}
public function b(){
return 'class b function b';
}
}
$b = new B();
$a = new A($b);
$c = $a->a();
var_dump($c);
以上就是个简单的依赖注入,但有可能类B中b方法改名为c了,那类A中调用a方法时触发的b方法同样要修改为c,还是进入了上面的怪圈中,稍有变动就要改动很多有关联的内容。
接口类特点:
实例代码:
<?php
class A{
protected $info;
// $b 为实例化的b
public function __construct($b){
$this->info = $b;
}
public function a(){
// 直接调用b中的方法
return $this->info->b();
}
}
// 接口类
interface B{
// 抽象方法,没有具体逻辑
public function b();
}
class C implements B{
public function b(){
return 'class c function B';
}
}
class D implements B{
public function b(){
return 'class d function b';
}
}
$c = new C();
$a = new A($c);
$c = $A->a();
var_dump($c);
在此代码中,实例化A时,不管传入C的实例或者D的实例都不影响类A中的a方法调用注入对象的b方法(此方法的方法名在抽象类中定义)
- THE END -