控制反转
如果要在 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']);
来源: http://www.bubuko.com/infodetail-3355119.html