反射
反射机制被各种语言广泛使用,主要是用来动态地获取系统中类,实例对象,方法等语言构建的信息,通过反射API函数可以实现对这些语言构建信息的动态获取和动态操作等.
反射API还提供了获取函数,类,和方法等语言构建中的文档注释,下面介绍一个实例
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
class Person {
/**
* For the sake of demonstration, we"re setting this private
*/
private $_allowDynamicAttributes = false;
/**
* type=primary_autoincrement
*/
protected $id = 0;
/**
* type=varchar length=255 null
*/
protected $name;
/**
* type=text null
*/
protected $biography;
public function getId() {
return $this->id;
}
public function setId($v) {
$this->id = $v;
}
public function getName() {
return $this->name;
}
public function setName($v) {
$this->name = $v;
}
public function getBiography() {
return $this->biography;
}
public function setBiography($v) {
$this->biography = $v;
}
}
// 参数是类的名称
$person = new ReflectionClass('Person');
反射之后就能获取到该类的一些相关信息,例如:
常量 Contants
属性 Property Names
方法 Method Names
静态属性 Static Properties
命名空间 Namespace
Person类是否为final或者abstract
// 这里就相当于获取该类的实例对象
$class = $person->newInstanceArgs();
$class->setName('Test');
$class->getName(); // Test
依赖注入的实现,就是运用了反射API,可以简单说明一下
1
2
3
4
5
6
7
8
9
10
// 取类的构造函数,返回的是ReflectionMethod对象
$constructor = $reflector->getConstructor();
如果构造函数存在,返回一个ReflectionMethod对象,相当于获取构造函数的反射类,当构造函数不存在,会返回一个NULL
对于不存在的,我们可以直接去实例化,就不需要去解决构造函数中的依赖问题
// 取构造函数的参数,这是一个对象数组
$parameters = $constructor->getParameters();
然后去解决构造函数中依赖参数问题,进而实现依赖注入
依赖注入这个内容还是比较多,这里主要是做一个反射的记录,对于一些反射的使用,可以去查看一些框架的源代码