本文实例讲述了php反射类ReflectionClass用法。分享给大家供大家参考,具体如下:
先来看一段代码:
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
|
/** * @name PHP反射API--利用反射技术实现的插件系统架构 * @author :PHPCQ.COM */ interface Iplugin { public static function getName(); } function findPlugins() { $plugins = array (); foreach (get_declared_classes() as $class ) { $reflectionClass = new ReflectionClass( $class ); if ( $reflectionClass - > implementsInterface( 'Iplugin' )) { $plugins [] = $reflectionClass ; } } return $plugins ; } function computeMenu() { $menu = array (); foreach (findPlugins() as $plugin ) { if ( $plugin - > hasMethod( 'getMenuItems' )) { $reflectionMethod = $plugin - > getMethod( 'getMenuItems' ); if ( $reflectionMethod - > isStatic()) { $items = $reflectionMethod - > invoke(null); } else { $pluginInstance = $plugin - > newInstance(); $items = $reflectionMethod - > invoke( $pluginInstance ); } $menu = array_merge ( $menu , $items ); } } return $menu ; } function computeArticles() { $articles = array (); foreach (findPlugins() as $plugin ) { if ( $plugin - > hasMethod( 'getArticles' )) { $reflectionMethod = $plugin - > getMethod( 'getArticles' ); if ( $reflectionMethod - > isStatic()) { $items = $reflectionMethod - > invoke(null); } else { $pluginInstance = $plugin - > newInstance(); $items = $reflectionMethod - > invoke( $pluginInstance ); } $articles = array_merge ( $articles , $items ); } } return $articles ; } require_once ( 'plugin.php' ); $menu = computeMenu(); $articles = computeArticles(); print_r( $menu ); print_r( $articles ); |
plugin.php 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php class MycoolPugin implements Iplugin { public static function getName() { return 'MycoolPlugin' ; } public static function getMenuItems() { return array ( array ( 'description' => 'MycoolPlugin' , 'link' => '/MyCoolPlugin' )); } public static function getArticles() { return array ( array ( 'path' => '/MycoolPlugin' , 'title' => 'This is a really cool article' , 'text' => xxxxxxxxx)); } } |
上述代码是php反射类的一个应用。
什么是php反射类,顾名思义,可以理解为一个类的映射。
举个例子:
1
2
3
4
5
6
7
|
class fuc { //定义一个类 static function ec() { echo '我是一个类' ; } } $class = new ReflectionClass( 'fuc' ); //建立 fuc这个类的反射类 |
至于$class 这反射类里有什么东东,可以查看手册,这里不详解了
1
2
3
|
$fuc = $class ->newInstance(); //相当于实例化 fuc 类 $fuc ->ec(); //执行 fuc 里的方法ec /*最后输出:我是一个类*/ |
其中还有一些更高级的用法
1
2
3
|
$ec = $class ->getmethod( 'ec' ); //获取fuc 类中的ec方法 $fuc = $class ->newInstance(); //实例化 $ec ->invoke( $fuc ); //执行ec 方法 |
上面的过程很熟悉吧。其实和调用对象的方法类似
只不过这里是反着来的,方法在前,对象在后
希望本文所述对大家PHP程序设计有所帮助。