PHP反射ReflectionClass、ReflectionMethod 入门教程

PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。

反射是什么?

它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对
象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。

反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

 

平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:

<?php
class Person {

    /**
     * For the sake of demonstration, we"re setting this private
     */
    private $_allowDynamicAttributes = false;

    /**
     * type=primary_autoincrement
     */
    protected $id = 0;

    /**
     * type=varchar length=255 null
     */
    protected $name;

    /**
     * type=text null
     */
    protected $biography;

    public function getId() {
        return $this->id;
    }

    public function setId($v) {
        $this->id = $v;
    }

    public function getName() {
        return $this->name;
    }

    public function setName($v) {
        $this->name = $v;
    }

    public function getBiography() {
        return $this->biography;
    }

    public function setBiography($v) {
        $this->biography = $v;
    }
}

 

 

一、通过ReflectionClass,我们可以得到Person类的以下信息:

  1. 常量 Contants
  2. 属性 Property Names
  3. 方法 Method Names静态
  4. 属性 Static Properties
  5. 命名空间 Namespace
  6. Person类是否为final或者abstract
  7. Person类是否有某个方法

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:



$class = new ReflectionClass('Person'); // 建立 Person这个类的反射类
$instance  = $class->newInstanceArgs($args); // 相当于实例化Person 类

1)获取属性(Properties):

$properties = $class->getProperties();
foreach ($properties as $property) {
    echo $property->getName() . "\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

 

可用参数列表:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

通过$property->getName()可以得到属性名。

 

2)获取注释:

通过getDocComment可以得到写给property的注释。 

foreach ($properties as $property) {
    if ($property->isProtected()) {
        $docblock = $property->getDocComment();
        preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
        echo $matches[1] . "\n";
    }
}
// Output:
// primary_autoincrement
// varchar
// text

3)获取类的方法

  • getMethods()       来获取到类的所有methods。
  • hasMethod(string)  是否存在某个方法
  • getMethod(string)  获取方法

 

4)执行类的方法:

$instance->getName(); // 执行Person 里的方法getName
// 或者:
$method = $class->getmethod('getName');    // 获取Person 类中的getName方法
$method->invoke($instance);                // 执行getName 方法
// 或者:
$method = $class->getmethod('setName');    // 获取Person 类中的setName方法
$method->invokeArgs($instance, array('snsgou.com'));

二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:

  1. 是否“public”、“protected”、“private” 、“static”类型
  2. 方法的参数列表
  3. 方法的参数个数
  4. 反调用类的方法
// 执行detail方法
$method = new ReflectionMethod('Person', 'test');

if ($method->isPublic() && !$method->isStatic()) {
    echo 'Action is right';
}
echo $method->getNumberOfParameters(); // 参数个数
echo $method->getParameters(); // 参数对象数组
时间: 2025-01-21 11:23:27

PHP反射ReflectionClass、ReflectionMethod 入门教程的相关文章

DWR入门教程(http://www.cnblogs.com/cyjch/archive/2012/02/16/2353758.html)

文章转载自<http://www.cnblogs.com/cyjch/archive/2012/02/16/2353758.html>,多谢大牛分享! DWR入门教程 DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本DWR0.6

THREE.JS入门教程(1)THREE.JS使用前了解_基础知识

Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D.但是目前这项技术还处在发展阶段,资料极为匮乏,爱好者学习基本要通过Demo源码和Three.js本身的源码来学习. 国外网站 aerotwist.com 有六篇较为简单的入门教程,我尝试着将其翻译过来,与大家分享. 我在一些实验项目中使用了Three.js,我发现它对快速上手浏览器3D编程确实很有帮助.通过Three.js,你不仅可以创建相机.物体.光线.材质等等,还可以选择

DNN快速入门教程3

看过了入门教程1和2相信大家已经基本了解DNN是个什么系统以及它的功能,但是我怎么才能用DNN创建一个网站?学习DNN很多人仍然没有头绪,现在我就以一个初学者的观点来看看我们应该做些什么. 创建普通网站的基本流程 试想下我们创建普通网站的流程,我想基本就是以下5步 规划网站页面结构:根据用户需求规划出网站的页面结构,例如首页,关于,联系,新闻 .... 网页设计: 用photoshop或者firework设计网页 制作网页模板:根据设计制作网页模板或者更原始点把设计转换成一页一页的html网页,

PHP入门教程:?(问号)和:(冒号)

例如: 1 $shenhe=$val['available']?"已审核":"未审核" 经常有刚接触php的朋友问我,php中经常见到如上代码的语句,问号和冒号是什么意思,这个语句是什么意思? 其实,这就是一个if语句的缩写,C语言里的语法,条件表达式e1?e2:e3,若e1为真(非0),则此表达式的值为e2的值:若为假,则表达式的值为e3.等同于 1 2 3 4 5 6 $e="";02.if(e1){ $e=e2; } else{ $e=e3

如何在Python的Flask框架中使用模版的入门教程

  如何在Python的Flask框架中使用模版的入门教程?          概述 如果你已经阅读过上一个章节,那么你应该已经完成了充分的准备工作并且创建了一个很简单的具有如下文件结构的Web应用: microblog |-flask文件夹 |-<一些虚拟环境的文件> |-app文件夹 | |-static文件夹 | |-templates文件夹 | |-__init__.py文件 | |-views.py文件 |-tmp文件夹 |-run.py文件 以上给你介绍了在Python的Flask

数据库快速入门教程--视频

数据库快速入门教程--视频 下载地址:http://v.51work6.com/courseInfoRedirect.do?action=courseInfo&courseId=240579 本课程是这个课程体系的核心之一,为软件开发人员所需数据库知识的学习教材,而不是培训一个DBA(数据库管理员),更具体的说是为Web开发程序员所需数据库知识的学习教材.基于培养程序员的目标,本课程对数据库和SQL语句的相关知识进行了深刻地阐明和分析,学习的重点是标准SQL语句的学习的掌握.常用数据库MySQL

新手必看:无线路由器设置入门教程

一.无线路由器基本 使用方法拿到手的无线路由器,连接好电源,无线路由器一般背面有5个网线插孔,其中一个颜色会与另外四个不同.如图498)this.w idth=498;' onmousewheel = 'javascript:return big(this)' alt="新手必看:无线路由器设置入门教程" width="474" height="205" src="http://images.51cto.com/files/upload

通过Ruby on Rails和docker构建微服务架构之入门教程

说到时下的架构,免不了会涉及到微服务.而谈到微服务架构,又跟容器和Docker技术脱不了关系.虽然容器和Docker并不完全是一回事,但两者是密不可分的,而且二者之间也有共同之处:在大型复杂应用的构建和运营方面,二者都可以大大提高企业的效率.   微服务可不像一般的应用,可以通过apt-get工具进行安装,大家可能会问了:我们该如何才能像安装应用一样实现这种服务呢?在很大的程度上,这个问题的答案是否定的,我们无法轻松实现这种服务.更准确的说,至少目前我们还无法实现.在一个系统中,最难修改的就是架

php中的curl使用入门教程和常见用法实例

[目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件上传 七.文件下载 八.http 验证 九.通过代理发送请求 十.发送json数据 十一.cURL批处理(multi cURL) 十二.总结 起先cURL是做为一种命令行工具设计出来的,比较幸运的是,php也支持cURL了.通过cURL这个利器,我们能在php程序中自由地发送 HTTP请求到某个url来获取