控制反转
如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A 类中。
依赖注入
依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
//代码实现控制反转&依赖注入 class SuperMan{ public function __construct($obj){ $obj->call(); } } class Xpower{ public function call (){ echo 111; } } class Ultrabomb { public function call(){ echo 222; } } class Container{ protected $binds; protected $instances; public function bind($abstract,$concreate){ if($concreate instanceof Closure){ $this->binds[$abstract]=$concreate; }else{ $this->instances[$abstract]=$concreate; } } public function make($abstract,$paramters=[]){ if(isset($this->instances[$abstract])){ return $this->instances[$abstract]; } array_unshift($paramters,$this); return call_user_func_array($this->binds[$abstract],$paramters); } } $container = new Container(); $container->bind("superman",function($container,$modelName=null){ return new SuperMan($container->make($modelName)); }); $container->bind('xpower',function($container){ return new Xpower(); }); $container->bind('ultrabomb',function($container){ return new Ultrabomb(); }); $superman1 = $container->make('superman',['xpower']); $superman2 = $container->make('superman',['ultrabomb']);