功能
函数式API
反射API
函数是否存在
function_exists
ReflectionFunction
类是否存在
class_exits
ReflectionClass
方法是否存在
method_exits
ReflectionMethod
变量/属性是否存在
property_exits
ReflectionProperty
获取类变量
get_class_vars
ReflectionClass::getProperties
获取类方法
get_class_methods
ReflectionClass::getMethods
获取类常量
—
ReflectionClass::RegetReflectionConstant(s)
获取函数/方法参数信息
—
ReflectionFunction/Method::getParameters
获取函数/方法返回值
—
ReflectionFunction/Method::getReturnType
类使用的特性
class_uses
ReflectionClass::getTraits
获取父类
class_parents
ReflectionClass::getParentClass
获取类实现的接口
class_implements
ReflectionClass::getInterfaceNames
获取类所在名字空间
__NAMESPACE__
ReflectionClass::getNamespaceName
函数调用
call_user_func(_array)
ReflectionMethod(Function)::invoke(Args)
获取类名
__CLASS__/::class
ReflectionClass::getName
获取函数名
__METHOD__/__FUNCTION__
ReflectionFunction/Method::getName
获取类/常量/变量/方法修饰符
—
ReflectionClass/Constant/Property/Method::getModifiers
获取所在文件
__FILE__
ReflectionClass/Constant/Function/Method::getFileName
获取所在行(范围)
—
ReflectionClass/Function/Method::getStartLine/getEndLine
获取文档
—
ReflectionClass/Function/Method::getDocComment
extension_loaded
ReflectionZendExtension
拓展
get_loaded_extensions
ReflectionExtension
get_extension_funcs
从上表可以看出反射API较函数式API能提供更全面的信息。还需要注意到__FILE__这类魔术常量是编译期的工作,不是运行时的能力。
同时给出RTTI的函数式API和反射API在功能上的差异:
功能
函数式API
反射API
类型判断
is_int/is_bool/is_array等
—
获取对象的类名
get_class
ReflectionObject::getName
获取对象父类
get_parent_class
ReflectionObject::getParentClass
类型/继承检测
instanceof/is_a/is_subclass_of
ReflectionObject::isInstance/isSubclassOf
生成器
—
ReflectionGenerator
总结
本文对PHP中的反射机制做了简要总结,并与在运行时获取代码信息的函数式API做了对比。即使你token_get_all用得再熟练,preg_match等文本操作用得再顺手,反射API仍有其独到一面,值得了解。如本人之前博文“PHP中的重载”所言,有了反射,function_exits/class_exits、call_user_func这些函数应该可以退休。但是考虑到兼容、使用便利、运行效率等因素,许多框架仍然依赖这些API。 (编辑:焦作站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|