PHP反射ReflectionClass、ReflectionMethod
来源:互联网 发布:北京赛车pk10数据分析 编辑:程序博客网 时间:2024/05/21 07:12
PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。
反射是什么?
它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。
PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。
平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:
01
<?php
02
class
Person
03
{
04
/**
05
* For the sake of demonstration, we"re setting this private
06
*/
07
private
$_allowDynamicAttributes
= false;
08
09
/**
10
* type=primary_autoincrement
11
*/
12
protected
$id
= 0;
13
14
/**
15
* type=varchar length=255 null
16
*/
17
protected
$name
;
18
19
/**
20
* type=text null
21
*/
22
protected
$biography
;
23
24
public
function
getId()
25
{
26
return
$this
->id;
27
}
28
29
public
function
setId(
$v
)
30
{
31
$this
->id =
$v
;
32
}
33
34
public
function
getName()
35
{
36
return
$this
->name;
37
}
38
39
public
function
setName(
$v
)
40
{
41
$this
->name =
$v
;
42
}
43
44
public
function
getBiography()
45
{
46
return
$this
->biography;
47
}
48
49
public
function
setBiography(
$v
)
50
{
51
$this
->biography =
$v
;
52
}
53
}
一、通过ReflectionClass,我们可以得到Person类的以下信息:
- 常量 Contants
- 属性 Property Names
- 方法 Method Names静态
- 属性 Static Properties
- 命名空间 Namespace
- Person类是否为final或者abstract
- Person类是否有某个方法
接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:
1
$class
=
new
ReflectionClass(
'Person'
);
// 建立 Person这个类的反射类
2
$instance
=
$class
->newInstanceArgs(
$args
);
// 相当于实例化Person 类
1)获取属性(Properties):
01
<?php
02
$properties
=
$class
->getProperties();
03
foreach
(
$properties
as
$property
)
04
{
05
echo
$property
->getName() .
"\n"
;
06
}
07
// 输出:
08
// _allowDynamicAttributes
09
// id
10
// name
11
// biography
默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:
1
$private_properties
=
$class
->getProperties(ReflectionProperty::IS_PRIVATE);
可用参数列表:
- ReflectionProperty::IS_STATIC
- ReflectionProperty::IS_PUBLIC
- ReflectionProperty::IS_PROTECTED
- ReflectionProperty::IS_PRIVATE
通过$property->getName()可以得到属性名。
2)获取注释:
通过getDocComment可以得到写给property的注释。
01
<?php
02
foreach
(
$properties
as
$property
)
03
{
04
if
(
$property
->isProtected())
05
{
06
$docblock
=
$property
->getDocComment();
07
preg_match(
'/ type\=([a-z_]*) /'
,
$property
->getDocComment(),
$matches
);
08
echo
$matches
[1] .
"\n"
;
09
}
10
}
11
// Output:
12
// primary_autoincrement
13
// varchar
14
// text
3)获取类的方法
- getMethods() 来获取到类的所有methods。
- hasMethod(string) 是否存在某个方法
- getMethod(string) 获取方法
4)执行类的方法:
1
$instance
->getName();
// 执行Person 里的方法getName
2
// 或者:
3
$method
=
$class
->getmethod(
'getName'
);
// 获取Person 类中的getName方法
4
$method
->invoke(
$instance
);
// 执行getName 方法
5
// 或者:
6
$method
=
$class
->getmethod(
'setName'
);
// 获取Person 类中的setName方法
7
$method
->invokeArgs(
$instance
,
array
(
'snsgou.com'
));
二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:
- 是否“public”、“protected”、“private” 、“static”类型
- 方法的参数列表
- 方法的参数个数
- 反调用类的方法
1
<?php
2
// 执行detail方法
3
$method
=
new
ReflectionMethod(
'Person'
,
'test'
);
4
if
(
$method
->isPublic() && !
$method
->isStatic())
5
{
6
echo
'Action is right'
;
7
}
8
echo
$method
->getNumberOfParameters();
// 参数个数
9
echo
$method
->getParameters();
// 参数对象数组
- PHP反射ReflectionClass、ReflectionMethod
- PHP的反射类ReflectionClass、ReflectionMethod学习记录
- PHP的反射类ReflectionClass、ReflectionMethod使用实例
- PHP反射(ReflectionClass、ReflectionMethod)在ThinkPHP框架的控制器调度模块中的应用
- php反射类 ReflectionClass
- php反射类 ReflectionClass
- php反射类 ReflectionClass
- php反射类 ReflectionClass
- php反射类 ReflectionClass
- PHP反射类ReflectionClass和ReflectionObject
- php ReflectionClass
- ReflectionClass 类
- ReflectionMethod->invokeArgs的大坑
- php反射
- PHP反射
- php反射
- PHP反射
- php 反射
- 简易购物车
- Objective-c编码规范
- 《swift2.0 官方教程中文版》 第2章-24访问控制
- static和extern与变量
- Android 内存管理 &Memory Leak & OOM 分析
- PHP反射ReflectionClass、ReflectionMethod
- C 语言学习 —— 《明解C语言》
- 在JAVA中如何连接SQL Server数据库
- 遇到的问题----js获取java的数组
- ceph安装命令罗列
- HighCharts中PieChart的实现
- mark
- socket的发送与接收缓冲区
- [jQuery] Introduction