php

php的反射类

功能强大的反射类

Posted by 憧憬 on December 23, 2018

反射

反射机制被各种语言广泛使用,主要是用来动态地获取系统中类,实例对象,方法等语言构建的信息,通过反射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();

然后去解决构造函数中依赖参数问题,进而实现依赖注入

依赖注入这个内容还是比较多,这里主要是做一个反射的记录,对于一些反射的使用,可以去查看一些框架的源代码