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确实能够获取很多有用的信息。