- 控制反转和依赖注入 意义:控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法。先看个小例子:
很明显 A类的method方法依赖于BC类,这也是我们开发的过程中经常看到的和用到的。但是这里有个问题,一旦涉及函数改名,函数参数数量变动,甚至整个类结构的调整,我们也要对A类做出相应的调整
IOC(控制反转)是处理这种问题的一个思路,DI(依赖注入)是实现这个思路的具体方法
高层模块不应该依赖于底层模块,两个都应该依赖抽象。
这里介绍一种方法:工厂模式注入
首先看到在A类 有很多new的操作,那么如果需要把A与BC类解耦就必须把new新对象的操作移除A类。很容易想到工厂模式。
class Factory{
public function create($classname)
{
switch ($classname) {
case 'B':
return new B();
break;
case 'C':
return new C();
default:
# code...
break;
}
}
}
//A类可以修改成
class A{
public $b;
public $c;
public function A1()
{
echo 'A';
}
public function method()
{
$factory = new Factory();//工厂类
$this->b = $factory->create('B');
$this->c = $factory->create('C');
$this->b->method();
$this->c->method();
}
}
这里其实已经解耦部分了,至少如果B类和C类的构造函数要是发生变化,比如修改函数参数等,我们只需要改Factory类就可以实现。
那么对于BC类的方法,我们其实可以把BC类的方法抽象出来做成一个接口
interface DImethod{
public function method();
}
class B implements DImethod{
public function B1(){}
public function method()
{
echo 'B';
}
}
class C implements DImethod{
public function C1(){}
public function method()
{
echo 'C';
}
}
这样在A就不在依赖于BC 而是依赖于factory类,而factory类依赖于BC类