1. 介绍

-- PHP5添加了一项新的功能:Reflection。这个功能使得phper可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。

-- 反射是什么?

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

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

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

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

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

1)常量 Contants

2)属性 Property Names

3)方法 Method Names静态

4)属性 Static Properties

5)命名空间 Namespace

6)Person类是否为final或者abstract

2. 具体例子

创建一个Person类,然后使用ReflectionClass反射它

2.1)【创建Persion类】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;

publicfunction 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;

}

}

Persion

2.2)【反射过程】

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:$class = new ReflectionClass('Person');//建立 Person这个类的反射类

$instance = $class->newInstanceArgs($args);//相当于实例化Person 类

2.3)【反射后使用】

2.3.1)获取属性(Properties)$properties = $class->getProperties();

foreach($properties as $property) {

echo $property->getName()."\n";

}

// 输出:

// _allowDynamicAttributes

// id

// name

// biography

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

privateproperties=privateproperties=class->getProperties(ReflectionProperty::IS_PRIVATE);

可用参数列表:ReflectionProperty::IS_STATIC

ReflectionProperty::IS_PUBLIC

ReflectionProperty::IS_PROTECTED

ReflectionProperty::IS_PRIVATE

如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED。

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

2.3.2)【获取注释】

通过getDocComment可以得到写给property的注释。foreach($propertiesas$property) {

if($property->isProtected()) {

$docblock = $property->getDocComment();

preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);

echo$matches[1]."\n";

}

}

// Output:

// primary_autoincrement

// varchar

// text

2.3.3)【获取类的方法】

获取方法(methods):通过getMethods() 来获取到类的所有methods。

2.3.4)【执行类的方法】$instance->getBiography(); //执行Person 里的方法getBiography

//或者:

$ec=$class->getmethod('getName'); //获取Person 类中的getName方法

$ec->invoke($instance); //执行getName 方法

php的persion是,php创建Persion类,反射过程,反射后使用流程详解相关推荐

  1. SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录

    1.开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId>&l ...

  2. C# 类、对象、方法和属性详解(重新排版,页面整洁)

    目录 一.相关概念: 二.类的定义与语法 三.类成员:数据成员和字段 三.实例化对象:关键字:new 四.属性 五.方法的参数 一.相关概念: 对象:现实世界中的实体(世间万物皆对象) 类:具有相似属 ...

  3. java创建线程的方式到底有几种?(详解)

    创建线程的方式到底有几种? 一,创建多线程的方式 1,官方解释 2,实现Runnable接口 3,继承Thread类 3,二者区别 3.1,本质区别 3.2,优先考虑使用第一种 二,误以为是创建线程的 ...

  4. 【创建型】工厂模式(Factory Pattern)详解

    工厂模式分为简单工厂.工厂方法.抽象工厂模式. 这一篇说一下简单工厂.工厂方法: 简单工厂 :用来生产同一等级结构中的任意产品.(不支持拓展增加产品) 工厂方法 :用来生产同一等级结构中的固定产品.( ...

  5. java中创建线程的四种方式及线程池详解

    众所周知,我们在创建线程时有四种方法可以用,分别是: 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 4.使用线程池创建(使用ja ...

  6. 什么叫做类的类?如何获取私有的方法?Java反射机制太强大了,详解Java反射机制【Java养成】

    Java学习打卡:第二十二天 内容导航 Java学习打卡:第二十二天 内容管理 Java反射机制 问题引入---数据库介绍 Java反射的介绍 class的使用 由字符串产生类和对象 获取一个类的所有 ...

  7. 文件系统管理 之 Linux 创建文件系统及挂载文件系统流程详解

    作者:北南南北 来自: LinuxSir.Org 摘要:本文对新增硬盘,切割硬盘,创建硬盘分区,为硬盘分区创建文件系统,以及加载文件系统的流程做总结性论述:主要是为初学者弄清楚这一操作过程:本文涉及f ...

  8. java 类参数_Java的数据类型和参数传递(详解)

    Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) shor ...

  9. 使用IDEA创建Maven项目和Maven使用入门(配图详解)

    本文详解的讲解了使用IDEA创建Maven项目,及Maven的基础入门. 1.打开IDEA,右上角选择File->New->Project 2.如图中所示选择Maven(可按自己所需添加, ...

最新文章

  1. 剖析Focal Loss损失函数: 消除类别不平衡+挖掘难分样本 | CSDN博文精选
  2. MySQL查看存储过程
  3. 2层,3层,4层交换机的区别与特点!!
  4. 闲聊Linux内存管理(1)
  5. python环境变量的配置 alias_vim-python环境配置
  6. 遮罩层中的相对定位与绝对定位(Ajax)
  7. excel 如何用vba将某一条记录移动到另一张工作表中_EXCEL常用快捷键
  8. 程序员们的三高:高并发、高性能、高可用
  9. java单元测试模拟输入_java – 单元测试:在定义模拟行为后调用...
  10. 操作系统笔记(含王道计算机考研——操作系统课件)
  11. ps3本服务器维修中,PS3大拆解图文详解!降低成本为目的
  12. @JsonFormat和@DataFormat的使用
  13. Jenkins下载历史Build版本的归档文件
  14. php如何取视频缩略图,视频提取缩略图
  15. 数控技能大赛计算机程序员,全国数控技能大赛计算机程序设计员-广东职业技能鉴定指导.DOC...
  16. 一度智信|拼多多店铺取名大全
  17. keil调试过程中源代码界面没有箭头
  18. 机器学习推导合集01-霍夫丁不等式的推导 Hoeffding Inequality
  19. 免费PDF转JPG软件(绿色版),PDF转换器工具,不好使你呼我【捡肥皂】
  20. 【学习记录】Python零基础入门(五)

热门文章

  1. 刺沙冰雪高爆版辅助多开方案
  2. CTF-PHP反序列化漏洞5-反序列化字符逃逸
  3. note-Linux大棚命令百篇1 Shell基础及工具篇
  4. 判断web网站是否站库分离
  5. dos命令之 assoc 用法详解
  6. 财务工具 - 编写一个等额本息反推利率的计算器
  7. 06-1-SVM原理
  8. 搜索功能这样设计,大家都说我有点东西
  9. 用excel解蓝桥杯(2018年第九届蓝桥杯A组)
  10. 机票html页面,机票详情页面.html