最近在使用tp5.1做公司的业务,增删改查部分和tp5.0的区别不大,在阅读文档时,看到了依赖注入和容器,这两个词听上去很高大上,之前也没有涉及过,于是,学习了一波。首先,我们要明确依赖注入和容器没有必然的关系。 所谓的依赖注入,就是将对象类型的数据 以参数的方式传到方法的参数列表 解决了向类中的方法传递对象的问题。而容器就是一个类,容器类,他是用来对类进行管理,可以理解为数组,一个key对应一个value,tp5.1中,这个key叫做标识,通过一个key对应一个类名/闭包函数/类实例/接口,我们可以把一个类绑定到容器中,然后进行使用,从而调用类的方法.
依赖注入
依赖:依赖是一种关系,A类中实例化了B类,那么A类的使用就需要用到B类,就叫做:B类是A类的依赖,也就是A类依赖于B类。
依赖注入的对象参数支持多个,并且和顺序无关。
支持使用依赖注入的场景包括(但不限于):
- 控制器架构方法;
 
- 控制器操作方法;
 
- 数据库和模型事件方法;
 
- 路由的闭包定义;
 
- 行为类的方法;
 
1 2 3 4 5 6 7
   |  public function getMethod(\app\common\Temp $temp)         {
 
                  $temp->setName('php');                 return $temp->getName();         }
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   | namespace app\common;
 
 
 
 
  class Temp {     private $name;          public function __construct($name='giao')     {         $this->name = $name;              }          public function setName($name)     {         $this->name = $name;     }          public function getName()     {         return '方法是:'.__METHOD__.'属性是:'.$this->name;     }  }
   | 
 
容器
容器的原理:单例模式 工厂模式 注册树模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
   |  
 
  class Test {     private static $test;      private function __construct($siteName)   //类实例化时自动调用构造函数     {         $this->siteName = $siteName;     }     private function __clone()     {  
      }
      public static function getInstance($siteName='php')     {         if (empty(self::$test)) {             self::$test = new test($siteName);         }         return self::$test;     } }
 
 
 
  class Factory {          public static function create()     {         return test::getInstance();     } }
 
 
 
 
 
 
 
  class Register {          protected static $objects = [];               public static function set($alias,$object)     {         self::$objects[$alias] = $object;     }                    public static function get($alias)     {        return  self::$objects[$alias];     }                    public static function unset($alias)     {         unset(self::$objects[$alias]);     }           }
  Register::set('site',Factory::create()); $obj = Register::get('site'); var_dump($obj); echo $obj->siteName;
   | 
 
     tp5.1中容器类的工作由think\Container类完成,如果理解了上面的代码,阅读源码还是很好理解的,使用过程中也可以更容易找到错误.
容器的绑定和使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   |          public function bindClass()         {                         Container::set('temp','\app\common\Temp');            
 
                   $temp=Container::get('temp',['name'=>'gigo_gigo']);             return $temp->getName();         }                                    public function bindClosure()         {                          Container::set('demo',function($domain){                return 'mydal博客的域名是'.$domain;             });                          return Container::get('demo',['domain'=>'mydal.cn']);         }
 
  | 
 
            自己对于依赖注入和容器的理解还是很浅显,以后工作中在更多场景使用之后,应该可以加强理解,本篇博客只是一个记录。