最近在使用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']); }
|
自己对于依赖注入和容器的理解还是很浅显,以后工作中在更多场景使用之后,应该可以加强理解,本篇博客只是一个记录。