mydal

怕光阴流逝 让一切都作废

0%

tp5.1的依赖注入和容器

最近在使用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)
{
// \app\common\Temp $temp 等价于 无需在类中实例化依赖类
// $temp = new \app\common\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
* @package 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();
}
}

/**
* 对象注册树
* 注册: set() 把对象挂到树上
* 获取: get() 把对象取下来用
* 注销: _unset() 把对象吃掉
*/

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');
//助手函数的使用 helper.php
// bind('temp','\app\common\Temp');
// $temp=app('temp',['name'=>'cxk_gigo']);

$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']);
}

自己对于依赖注入和容器的理解还是很浅显,以后工作中在更多场景使用之后,应该可以加强理解,本篇博客只是一个记录。