Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射。尝试着用java的思想去理解php的反射,跟java基本上基本一致。参考了php手册:http://www.php.net/manual/zh/book.reflection.php。
ReflectTest.php:
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
<?php class ReflectTest { /** * 用户ID */ private $userId ; /** * 用户名 */ private $userName ; /** * 用户密码 */ private $password ; /** * 用户邮箱 */ private $email ; /** * 用户QQ号码 */ private $qq ; /** * 登陆次数 */ private $loginTimes ; public function ReflectTest(){ } public function __construct( $userId , $userName , $password ){ $this ->userId = $userId ; $this ->userName = $userName ; $this ->password = $password ; } /** * * @return the $userId */ public function getUserId() { return $this ->userId; } /** * * @return the $userName */ public function getUserName() { return $this ->userName; } /** * * @return the $password */ public function getPassword() { return $this ->password; } /** * * @return the $email */ public function getEmail() { return $this ->email; } /** * * @return the $qq */ public function getQq() { return $this ->qq; } /** * * @return the $loginTimes */ public function getLoginTimes() { return $this ->loginTimes; } /** * * @param field_type $userId */ public function setUserId( $userId ) { $this ->userId = $userId ; } /** * * @param field_type $userName */ public function setUserName( $userName ) { $this ->userName = $userName ; } /** * * @param field_type $password */ public function setPassword( $password ) { $this ->password = $password ; } /** * * @param field_type $email */ public function setEmail( $email ) { $this ->email = $email ; } /** * * @param field_type $qq */ public function setQq( $qq ) { $this ->qq = $qq ; } /** * * @param field_type $loginTimes */ public function setLoginTimes( $loginTimes ) { $this ->loginTimes = $loginTimes ; } } ?> |
Test.php:
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
|
<?php require_once 'ReflectTest.php' ; $ref = new ReflectTest( "1" , "admin" , "admin888" ); //实例化ReflectTest echo "<h1>ReflectTest init.</h1><br/>UserId:" . $ref ->getUserId(). "<br/>UserName:" . $ref ->getUserName(). "<br/>Password:" . $ref ->getPassword(); $class = new ReflectionClass( 'ReflectTest' ); //反射加载ReflectTest类 $instance = $class ->newInstanceArgs( array ( '123' , 'root' , '123456' )); //ReflectTest初始化 echo "<h1>Field:</h1><br/>" ; $field = $class ->getProperties(); foreach ( $field as $f ) { echo $f ->getName(). "<br/>" ; //反射输出所有的成员变量 } echo "<h1>get Fields DocComment:</h1><br/>" ; foreach ( $field as $f ) { $docComment = $f ->getDocComment(); //反射输出所有成员变量的文档注释 echo $docComment . "<br/>" ; } $method = $class ->getMethods(); //获取ReflectTest所有方法 echo "<h1>get Methods DocComment:</h1><br/>" ; foreach ( $method as $m ) { $docComment = $m ->getDocComment(); //获取所有方法的文档注释 echo $docComment . "<br/>" ; } echo "<h1>get Methods:</h1><br/>" ; foreach ( $method as $m ) { $k = "get" ; //只调ReflectTest中的所有的get方法 echo $m ->getName(). "=" .( $k === "" || strpos ( $m ->getName (), $k ) === 0? $m ->invoke( $instance ): "" ). "<br/>" ; if ( "setQq" == $m ->getName()){ $m ->invoke( $instance , '441637262' ); //调用setQq方法为ReflectTest当中的成员变量qq设值 } } echo "<h1>Invoke (set/get)Qq result:</h1><br/>" ; $qq = $class ->getmethod( 'getQq' ); //获取getQq方法 echo "getQQ:" . $qq ->invoke( $instance ). "<br/>" ; //获取成员变量qq的值 echo "jb51.net" ; ?> |
请求http://localhost/php/test/Test.php输出结果:
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
|
ReflectTest init. UserId:1 UserName:admin Password:admin888 Field: userId userName password email qq loginTimes get Fields DocComment: /** * 用户ID */ /** * 用户名 */ /** * 用户密码 */ /** * 用户邮箱 */ /** * 用户QQ号码 */ /** * 登陆次数 */ get Methods DocComment: /** * * @return the $userId */ /** * * @return the $userName */ /** * * @return the $password */ /** * * @return the $email */ /** * * @return the $qq */ /** * * @return the $loginTimes */ /** * * @param field_type $userId */ /** * * @param field_type $userName */ /** * * @param field_type $password */ /** * * @param field_type $email */ /** * * @param field_type $qq */ /** * * @param field_type $loginTimes */ get Methods: ReflectTest= __construct= getUserId=123 getUserName=root getPassword=123456 getEmail= getQq= getLoginTimes= setUserId= setUserName= setPassword= setEmail= setQq= setLoginTimes= Invoke (set/get)Qq result: getQQ:441637262 jb51.net |