是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式就是依赖注入(Dependency Injection,简称DI)。 书本上的解释:
其实书本上的解释已经很明了,不明白的继续往下看示例 辅助理解:
什么是正转?正转就是我们的一般写法,在类中需要使用什么就直接创建对应的实例,如下。
class c
{
public function say()
{
echo 'hello';
}
}
/**
* Class a
*/
class a
{
private $c;
public function __construct()
{
$this->c = new C(); // 实例化创建C类
}
public function sayC()
{
echo $this->c->say(); // 调用C类中的方法
}
}
$a = new a();
$a->sayC();
上面的示例中,a类依赖c类,在a类的构造函数中就实例化了c类,显然这是直接在程序内部实例化的,不符合控制反转。
控制反转示例:
/**
* Class c
*/
class c
{
public function say()
{
echo 'hello';
}
}
/**
* Class a
*/
class a
{
private $c;
public function setC(C $c)
{
$this->c = $c; // 实例化创建C类
}
public function sayC()
{
echo $this->c->say(); // 调用C类中的方法
}
}
$c = new C();
$a = new a();
$a->setC($c);
$a->sayC();
这里的a类同样依赖于c类,但是a类仅有c类的使用权,c类的控制权并不在a类的手中。
换而言之,这里c类的实例化放到了a类的外部,通过调用a类的方法的形式获取到c类的对象,这就是控制反转,而这个过程也就做依赖注入。