PHP5添加了一个新的特征:反射。此功能允许程序员逆向工程类、接口、功能、方法和扩展。通过PHP代码,你可以得到所有的对象信息,可以与它进行交互。

假设有一个阶级的人:

复制代码代码如下所示:

类人{



*为了演示,我们正在设置这个私有

* /

私人_allowdynamicattributes美元= false;



类型= primary_autoincrement / * * /

受保护的$ id = 0;



类型= varchar长度= 255 / /零* * *

受保护的$名称;



类型=文本null

受保护的传记;



公共函数getID()

{

返回$;

}

公共功能的压缩文件SetID($ V)

{

$;

}

公共职能getName()

{

返回$这个名称;

}

公共职能setName($ V)

{

$;

}

公共功能getbiography()

{

这是传记;

}

公共功能setbiography($ V)

{

这篇传记;

}

}



通过ReflectionClass,我们可以从中得到以下的人类信息:

1。常数常数

2。属性名称

3。方法名称

4。静态属性

5。命名空间的命名空间

6人称类是最终的还是抽象的

只是通过类的名称人ReflectionClass。

复制代码代码如下所示:

美元类=新ReflectionClass('person);



获取属性(属性):

复制代码代码如下所示:

$属性=美元类-> getProperties();

foreach($美元财产性质){

echo $属性-> getName()。;

}

输出:

/ / _allowdynamicattributes



/名称

{传记}



默认情况下,ReflectionClass会得到所有的性质,以及私有和保护。如果你只是想获得的私有财产,你想通过参数外量:

复制代码代码如下所示:

private_properties美元=美元类-> getProperties(reflectionproperty::is_private);



可用参数列表:

复制代码代码如下所示:

reflectionproperty::is_static

reflectionproperty::is_public

reflectionproperty::is_protected

reflectionproperty::is_private

如果你想得到的公共属性,写私人reflectionproperty:::::| is_public is_protected reflectionproperty

你不应该感到奇怪。

属性名可以获得美元财产> getName(),和注释写入属性可以通过getdoccomment获得。

复制代码代码如下所示:

foreach($美元财产性质){

如果($属性->保护()){

docblock美元=美元财产-> getdoccomment();

(preg_match / =({ a-z_ } *)属性-> getdoccomment美元($匹配) /,,);

匹配$ { 1 }。;

}

}

输出:

/ / primary_autoincrement

/ / varchar

文本



这有点奇怪,即使是注释也可以。

存取方法(方法):通过getMethods获得所有的类方法(),返回的是反射对象数组。没有更多的演示。

最后,在类的方法是通过反射波法。

复制代码代码如下所示:

$ =数组()= 1,名称克里斯

foreach(美元美元美元数据关键=值){

如果(!美元类-> hasproperty($键)){

抛出新的异常($键)。不是一个有效的属性;

}



如果(!美元类-> hasmethod(。Ucfirst($关键))){

抛出新的异常($键)。缺少一个消气剂;

}



如果(!美元类-> hasmethod(。Ucfirst($关键))){

抛出新的异常($键)。缺少一个二传手;

}



创建一个新对象来进行交互

对象=新的人();



获取get方法,并将其与数据数组中的值一起调用

二传=美元美元类-> getMethod(设置。Ucfirst($键));

$ $ = $;



获取方法并调用它

二传=美元美元类>中(得到。Ucfirst($键));

objvalue美元=美元->调用setter(元对象);



现在比较

如果(美元价值= = $ objvalue){

吸气剂或二传手修改了数据。;

{人}

应答器和设置程序不修改数据。;

}

}



有点意思。