PHP Reflection API详解
PHPReflectionAPI是PHP5才有的新功能,它是用来导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
PHPReflectionAPI有:
classReflection{}
interfaceReflector{}
classReflectionExceptionextendsException{}
classReflectionFunctionimplementsReflector{}
classReflectionParameterimplementsReflector{}
classReflectionMethodextendsReflectionFunction{}
classReflectionClassimplementsReflector{}
classReflectionObjectextendsReflectionClass{}
classReflectionPropertyimplementsReflector{}
classReflectionExtensionimplementsReflector{}
具体API说明:
①Reflection类
<?php
classReflection
{
publicstaticmixedexport(Reflectorr[,boolreturn])
//导出一个类或方法的详细信息
publicstaticarraygetModifierNames(intmodifiers)
//取得修饰符的名字
}
?>
②ReflectionException类
该类继承标准类,没特殊方法和属性。
③ReflectionFunction类
<?php
classReflectionFunctionimplementsReflector
{
finalprivate__clone()
publicobject__construct(stringname)
publicstring__toString()
publicstaticstringexport()
//导出该函数的详细信息
publicstringgetName()
//取得函数名
publicboolisInternal()
//测试是否为系统内部函数
publicboolisUserDefined()
//测试是否为用户自定义函数
publicstringgetFileName()
//取得文件名,包括路径名
publicintgetStartLine()
//取得定义函数的起始行
publicintgetEndLine()
//取得定义函数的结束行
publicstringgetDocComment()
//取得函数的注释
publicarraygetStaticVariables()
//取得静态变量
publicmixedinvoke(mixed*args)
//调用该函数,通过参数列表传参数
publicmixedinvokeArgs(arrayargs)
//调用该函数,通过数组传参数
publicboolreturnsReference()
//测试该函数是否返回引用
publicReflectionParameter[]getParameters()
//取得该方法所需的参数,返回值为对象数组
publicintgetNumberOfParameters()
//取得该方法所需的参数个数
publicintgetNumberOfRequiredParameters()
//取得该方法所需的参数个数
}
?>
④ReflectionParameter类:
<?php
classReflectionParameterimplementsReflector
{
finalprivate__clone()
publicobject__construct(stringname)
publicstring__toString()
publicstaticstringexport()
//导出该参数的详细信息
publicstringgetName()
//取得参数名
publicboolisPassedByReference()
//测试该参数是否通过引用传递参数
publicReflectionClassgetClass()
//若该参数为对象,返回该对象的类名
publicboolisArray()
//测试该参数是否为数组类型
publicboolallowsNull()
//测试该参数是否允许为空
publicboolisOptional()
//测试该参数是否为可选的,当有默认参数时可选
publicboolisDefaultValueAvailable()
//测试该参数是否为默认参数
publicmixedgetDefaultValue()
//取得该参数的默认值
}
?>
⑤ReflectionClass类:
<?php
classReflectionClassimplementsReflector
{
finalprivate__clone()
publicobject__construct(stringname)
publicstring__toString()
publicstaticstringexport()
//导出该类的详细信息
publicstringgetName()
//取得类名或接口名
publicboolisInternal()
//测试该类是否为系统内部类
publicboolisUserDefined()
//测试该类是否为用户自定义类
publicboolisInstantiable()
//测试该类是否被实例化过
publicboolhasConstant(stringname)
//测试该类是否有特定的常量
publicboolhasMethod(stringname)
//测试该类是否有特定的方法
publicboolhasProperty(stringname)
//测试该类是否有特定的属性
publicstringgetFileName()
//取得定义该类的文件名,包括路径名
publicintgetStartLine()
//取得定义该类的开始行
publicintgetEndLine()
//取得定义该类的结束行
publicstringgetDocComment()
//取得该类的注释
publicReflectionMethodgetConstructor()
//取得该类的构造函数信息
publicReflectionMethodgetMethod(stringname)
//取得该类的某个特定的方法信息
publicReflectionMethod[]getMethods()
//取得该类的所有的方法信息
publicReflectionPropertygetProperty(stringname)
//取得某个特定的属性信息
publicReflectionProperty[]getProperties()
//取得该类的所有属性信息
publicarraygetConstants()
//取得该类所有常量信息
publicmixedgetConstant(stringname)
//取得该类特定常量信息
publicReflectionClass[]getInterfaces()
//取得接口类信息
publicboolisInterface()
//测试该类是否为接口
publicboolisAbstract()
//测试该类是否为抽象类
publicboolisFinal()
//测试该类是否声明为final
publicintgetModifiers()
//取得该类的修饰符,返回值类型可能是个资源类型
//通过Reflection::getModifierNames($class->getModifiers())进一步读取
publicboolisInstance(stdclassobject)
//测试传入的对象是否为该类的一个实例
publicstdclassnewInstance(mixed*args)
//创建该类实例
publicReflectionClassgetParentClass()
//取得父类
publicboolisSubclassOf(ReflectionClassclass)
//测试传入的类是否为该类的父类
publicarraygetStaticProperties()
//取得该类的所有静态属性
publicmixedgetStaticPropertyValue(stringname[,mixeddefault])
//取得该类的静态属性值,若private,则不可访问
publicvoidsetStaticPropertyValue(stringname,mixedvalue)
//设置该类的静态属性值,若private,则不可访问,有悖封装原则
publicarraygetDefaultProperties()
//取得该类的属性信息,不含静态属性
publicboolisIterateable()
publicboolimplementsInterface(stringname)
//测试是否实现了某个特定接口
publicReflectionExtensiongetExtension()
publicstringgetExtensionName()
}
?>
⑥ReflectionMethod类:
<?php
classReflectionMethodextendsReflectionFunction
{
public__construct(mixedclass,stringname)
publicstring__toString()
publicstaticstringexport()
//导出该方法的信息
publicmixedinvoke(stdclassobject,mixed*args)
//调用该方法
publicmixedinvokeArgs(stdclassobject,arrayargs)
//调用该方法,传多参数
publicboolisFinal()
//测试该方法是否为final
publicboolisAbstract()
//测试该方法是否为abstract
publicboolisPublic()
//测试该方法是否为public
publicboolisPrivate()
//测试该方法是否为private
publicboolisProtected()
//测试该方法是否为protected
publicboolisStatic()
//测试该方法是否为static
publicboolisConstructor()
//测试该方法是否为构造函数
publicboolisDestructor()
//测试该方法是否为析构函数
publicintgetModifiers()
//取得该方法的修饰符
publicReflectionClassgetDeclaringClass()
//取得该方法所属的类
//InheritedfromReflectionFunction
finalprivate__clone()
publicstringgetName()
publicboolisInternal()
publicboolisUserDefined()
publicstringgetFileName()
publicintgetStartLine()
publicintgetEndLine()
publicstringgetDocComment()
publicarraygetStaticVariables()
publicboolreturnsReference()
publicReflectionParameter[]getParameters()
publicintgetNumberOfParameters()
publicintgetNumberOfRequiredParameters()
}
?>
⑦ReflectionProperty类:
<?php
classReflectionPropertyimplementsReflector
{
finalprivate__clone()
public__construct(mixedclass,stringname)
publicstring__toString()
publicstaticstringexport()
//导出该属性的详细信息
publicstringgetName()
//取得该属性名
publicboolisPublic()
//测试该属性名是否为public
publicboolisPrivate()
//测试该属性名是否为private
publicboolisProtected()
//测试该属性名是否为protected
publicboolisStatic()
//测试该属性名是否为static
publicboolisDefault()
publicintgetModifiers()
//取得修饰符
publicmixedgetValue(stdclassobject)
//取得该属性值
publicvoidsetValue(stdclassobject,mixedvalue)
//设置该属性值
publicReflectionClassgetDeclaringClass()
//取得定义该属性的类
publicstringgetDocComment()
//取得该属性的注释
}
?>
⑧ReflectionExtension类
<?php
classReflectionExtensionimplementsReflector{
finalprivate__clone()
public__construct(stringname)
publicstring__toString()
publicstaticstringexport()
//导出该扩展的所有信息
publicstringgetName()
//取得该扩展的名字
publicstringgetVersion()
//取得该扩展的版本
publicReflectionFunction[]getFunctions()
//取得该扩展的所有函数
publicarraygetConstants()
//取得该扩展的所有常量
publicarraygetINIEntries()
//取得与该扩展相关的,在php.ini中的指令信息
publicReflectionClass[]getClasses()
publicarraygetClassNames()
}
?>
使用例子:
<?php
classPerson{
private$_name;
public$age;
publicfunction__construct(){
$this->sex="male";
}
publicfunctionaction(){
echo"来自https://www.nhooo.com的测试";
}
}
$class=newReflectionClass('Person');
//获取属性
foreach($class->getProperties()as$property){
echo$property->getName()."\n";
}
//获取方法
print_r($class->getMethods());
$p1=newPerson();
$obj=newReflectionObject($p1);
//获取对象和类的属性
print_r($obj->getProperties());
很明显上面代码中对象和类获取的属性是不同的,这是因为对象进行了contruct实例化,因此多了sex属性,PHPReflection确实能够获取很多有用的信息。