热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP反射机制详解以及插件架构实现

该扩展分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
1。用途:
该扩展分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
Reflection可以说是对php库函数:“Classes/Objects 类/对象函数”的一个扩展。
主要用在通过程序检测现有php程序内部关于类、方法等信息,并做出处理。

2。API概览:
class Reflection { }
interface Reflector { }
class ReflectionException extends Exception { }
class ReflectionFunction implements Reflector { }
class ReflectionParameter implements Reflector { }
class ReflectionMethod extends ReflectionFunction { }
class ReflectionClass implements Reflector { }
class ReflectionObject extends ReflectionClass { }
class ReflectionProperty implements Reflector { }
class ReflectionExtension implements Reflector { }

3。详细说明:(例子详见php手册)
①Reflection类
class Reflection
{
    public static mixed export(Reflector r [,bool return])
    //导出一个类或方法的详细信息
    public static array getModifierNames(int modifiers)
    //取得修饰符的名字
}
?>

②ReflectionException类

该类继承标准类,没特殊方法和属性。

③ReflectionFunction类
class ReflectionFunction implements Reflector
{
    final private __clone()
    public object __construct(string name)
    public string __toString()
    public static string export()
    //导出该函数的详细信息
    public string getName()
    //取得函数名
    public bool isInternal()
    //测试是否为系统内部函数
    public bool isUserDefined()
    //测试是否为用户自定义函数
    public string getFileName()
    //取得文件名,包括路径名
    public int getStartLine()
    //取得定义函数的起始行
    public int getEndLine()
    //取得定义函数的结束行
    public string getDocComment()
    //取得函数的注释
    public array getStaticVariables()
    //取得静态变量
    public mixed invoke(mixed* args)
    //调用该函数,通过参数列表传参数
    public mixed invokeArgs(array args)
    //调用该函数,通过数组传参数
    public bool returnsReference()
    //测试该函数是否返回引用
    public ReflectionParameter[] getParameters()
    //取得该方法所需的参数,返回值为对象数组
    public int getNumberOfParameters()
    //取得该方法所需的参数个数
    public int getNumberOfRequiredParameters()
    //取得该方法所需的参数个数
}
?>

④ReflectionParameter类:
class ReflectionParameter implements Reflector
{
    final private __clone()
    public object __construct(string name)
    public string __toString()
    public static string export()
    //导出该参数的详细信息
    public string getName()
    //取得参数名
    public bool isPassedByReference()
    //测试该参数是否通过引用传递参数
    public ReflectionClass getClass()
    //若该参数为对象,返回该对象的类名
    public bool isArray()
    //测试该参数是否为数组类型
    public bool allowsNull()
    //测试该参数是否允许为空
    public bool isOptional()
    //测试该参数是否为可选的,当有默认参数时可选
    public bool isDefaultValueAvailable()
    //测试该参数是否为默认参数
    public mixed getDefaultValue()
    //取得该参数的默认值
}
?>

⑤ReflectionClass类:
class ReflectionClass implements Reflector
{
    final private __clone()
    public object __construct(string name)
    public string __toString()
    public static string export()
    //导出该类的详细信息
    public string getName()
    //取得类名或接口名
    public bool isInternal()
    //测试该类是否为系统内部类
    public bool isUserDefined()
    //测试该类是否为用户自定义类
    public bool isInstantiable()
    //测试该类是否被实例化过
    public bool hasConstant(string name)
    //测试该类是否有特定的常量
    public bool hasMethod(string name)
    //测试该类是否有特定的方法
    public bool hasProperty(string name)
    //测试该类是否有特定的属性
    public string getFileName()
    //取得定义该类的文件名,包括路径名
    public int getStartLine()
    //取得定义该类的开始行
    public int getEndLine()
    //取得定义该类的结束行
    public string getDocComment()
    //取得该类的注释
    public ReflectionMethod getConstructor()
    //取得该类的构造函数信息
    public ReflectionMethod getMethod(string name)
    //取得该类的某个特定的方法信息
    public ReflectionMethod[] getMethods()
    //取得该类的所有的方法信息
    public ReflectionProperty getProperty(string name)
    //取得某个特定的属性信息
    public ReflectionProperty[] getProperties()
    //取得该类的所有属性信息
    public array getConstants()
    //取得该类所有常量信息
    public mixed getConstant(string name)
    //取得该类特定常量信息
    public ReflectionClass[] getInterfaces()
    //取得接口类信息
    public bool isInterface()
    //测试该类是否为接口
    public bool isAbstract()
    //测试该类是否为抽象类
    public bool isFinal()
    //测试该类是否声明为final
    public int getModifiers()
    //取得该类的修饰符,返回值类型可能是个资源类型
    //通过Reflection::getModifierNames($class->getModifiers())进一步读取
    public bool isInstance(stdclass object)
    //测试传入的对象是否为该类的一个实例
    public stdclass newInstance(mixed* args)
    //创建该类实例
    public ReflectionClass getParentClass()
    //取得父类
    public bool isSubclassOf(ReflectionClass class)
    //测试传入的类是否为该类的父类
    public array getStaticProperties()
    //取得该类的所有静态属性
    public mixed getStaticPropertyValue(string name [, mixed default])
    //取得该类的静态属性值,若private,则不可访问
    public void setStaticPropertyValue(string name, mixed value)
    //设置该类的静态属性值,若private,则不可访问,有悖封装原则
    public array getDefaultProperties()
    //取得该类的属性信息,不含静态属性
    public bool isIterateable()
    public bool implementsInterface(string name)
    //测试是否实现了某个特定接口
    public ReflectionExtension getExtension()
    public string getExtensionName()
}
?>

⑥ReflectionMethod类:
class ReflectionMethod extends ReflectionFunction
{
    public __construct(mixed class, string name)
    public string __toString()
    public static string export()
    //导出该方法的信息
    public mixed invoke(stdclass object, mixed* args)
    //调用该方法
    public mixed invokeArgs(stdclass object, array args)
    //调用该方法,传多参数
    public bool isFinal()
    //测试该方法是否为final
    public bool isAbstract()
    //测试该方法是否为abstract
    public bool isPublic()
    //测试该方法是否为public
    public bool isPrivate()
    //测试该方法是否为private
    public bool isProtected()
    //测试该方法是否为protected
    public bool isStatic()
    //测试该方法是否为static
    public bool isConstructor()
    //测试该方法是否为构造函数
    public bool isDestructor()
    //测试该方法是否为析构函数
    public int getModifiers()
    //取得该方法的修饰符
    public ReflectionClass getDeclaringClass()
    //取得该方法所属的类
    // Inherited from ReflectionFunction
    final private __clone()
    public string getName()
    public bool isInternal()
    public bool isUserDefined()
    public string getFileName()
    public int getStartLine()
    public int getEndLine()
    public string getDocComment()
    public array getStaticVariables()
    public bool returnsReference()
    public ReflectionParameter[] getParameters()
    public int getNumberOfParameters()
    public int getNumberOfRequiredParameters()
}
?>

⑦ReflectionProperty类:
class ReflectionProperty implements Reflector
{
    final private __clone()
    public __construct(mixed class, string name)
    public string __toString()
    public static string export()
    //导出该属性的详细信息
    public string getName()
    //取得该属性名
    public bool isPublic()
    //测试该属性名是否为public
    public bool isPrivate()
    //测试该属性名是否为private
    public bool isProtected()
    //测试该属性名是否为protected
    public bool isStatic()
    //测试该属性名是否为static
    public bool isDefault()
    public int getModifiers()
    //取得修饰符
    public mixed getValue(stdclass object)
    //取得该属性值
    public void setValue(stdclass object, mixed value)
    //设置该属性值
    public ReflectionClass getDeclaringClass()
    //取得定义该属性的类
    public string getDocComment()
    //取得该属性的注释
}
?>

⑧ReflectionExtension类
class ReflectionExtension implements Reflector {
    final private __clone()
    public __construct(string name)
    public string __toString()

    public static string export()
    //导出该扩展的所有信息
    public string getName()
    //取得该扩展的名字
    public string getVersion()
    //取得该扩展的版本
    public ReflectionFunction[] getFunctions()
    //取得该扩展的所有函数
    public array getConstants()
    //取得该扩展的所有常量
    public array getINIEntries()
    //取得与该扩展相关的,在php.ini中的指令信息
    public ReflectionClass[] getClasses()
    public array getClassNames()
}
?>

4。附:

其实从第二点API概览可以看出:接口挺好用的。
一方面Reflector接口为Reflection小系统提供了一个很好的接口命名规范,
每个实现他的类都须按他的规范,从外部看来,这个小系统API很统一。
另一方面由于很多类实现了Reflector接口,
在这样的类层次结构中,若想实现多态是很容易的。



演示用代码如下所示:

class ClassOne {
function callClassOne() {
print "In Class One";
}
}
class ClassOneDelegator {
private $targets;
function __construct() {
$this->target[] = new ClassOne();
}
function __call($name, $args) {
foreach ($this->target as $obj) {
$r = new ReflectionClass($obj);
if ($method = $r->getMethod($name)) {
if ($method->isPublic() && !$method->isAbstract()) {
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = new ClassOneDelegator();
$obj->callClassOne();
?>

输出结果:
In Class One
可见,通过代理类ClassOneDelegator来代替ClassOne类来实现他的方法
同样的,如下的代码也是能够运行的:

class ClassOne {
function callClassOne() {
print "In Class One";
}
}
class ClassOneDelegator {
private $targets;
function addObject($obj) {
$this->target[] = $obj;
}
function __call($name, $args) {
foreach ($this->target as $obj) {
$r = new ReflectionClass($obj);
if ($method = $r->getMethod($name)) {
if ($method->isPublic() && !$method->isAbstract()) {
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = new ClassOneDelegator();
$obj->addObject(new ClassOne());
$obj->callClassOne();
?>

推荐阅读
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 深入理解父组件与子组件的引用和访问
    本文详细介绍了如何在Vue.js中通过$children和$refs属性实现父组件对子组件的访问,并提供了具体的代码示例及最佳实践。 ... [详细]
  • 极大似然估计(MLE)及其3D可视化解析
    本文详细介绍了极大似然估计(Maximum Likelihood Estimation, MLE)的推导过程,并通过3D可视化展示其在概率密度函数中的应用。我们将探讨如何利用MLE来估计参数,以及它在实际问题中的重要性。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 探讨一个老旧 PHP MySQL 系统中,时间戳字段不定期出现异常值的问题及其可能原因。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 郑州大学在211高校中的地位与排名解析
    本文将详细解读郑州大学作为一所位于河南省的211和双一流B类高校,在全国211高校中的地位与排名,帮助高三学生更好地了解这所知名学府的实力与发展前景。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 电子元件封装库:三极管、MOS管及部分LDO(含3D模型)
    本资源汇集了常用的插件和贴片三极管、MOS管以及部分LDO的封装,涵盖TO和SOT系列。所有封装均配有高质量的3D模型,共计96种,满足日常设计需求。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
author-avatar
mobiledu2502885517
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有