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. Java基础语法纯小白入门
  2. 一篇文章讲懂Vmware网卡配置,解决常见问题
  3. CentOS环境搭建
  4. 网易云信三周年:我们只做第一
  5. mysql include files_安装sphinx出现错误ERROR: cannot find MySQL include files.
  6. github windows客户端
  7. 五子棋项目结束总结_居家活动系列总结
  8. 基于多源文档片段的神经网络排序模型(Neural Ranking Models with Multiple Document Fields)
  9. 接口返回buffer的16进制数据如何转换
  10. Linux mii-tool命令
  11. 获取对象属性名的方法 Object.keys() 与 Object.getOwnPropertyNames() 与 for循环
  12. mfsort shell语法_8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下...
  13. 63 岁工程师的退休生活:开发一款计算器应用,22 天获 56800 下载!
  14. 《深入浅出MFC》系列之消息映射(一)
  15. windows 系统 局域网 屏幕共享
  16. H5社交漂流瓶交友源码/附安装教程
  17. 《SuperMap iDesktop的理论知识》
  18. android 应用自启管理
  19. 轻松玩转自动机器学习AutoML:H2O Flow
  20. Webpack4.0各个击破(6)loader篇

热门文章

  1. java五子棋技术路线_五子棋游戏程序设计(VB)
  2. 完整ASCII字符表
  3. 灵雀云ACP成功通过金融信创生态实验室适配验证
  4. linux安装程序出现了问题,linux安装extundelete以及对遇到问题的解决
  5. 118.网络安全渗透测试—[权限提升篇16]—[Windows MSF提权模块提权审计工具]
  6. 文件上传,出现400 的错误问题
  7. js获取树形JSON数据根节点到任一子节点路径
  8. Avalonia UI 简介
  9. 顺丰快递:请签收Netty灵魂十连问
  10. 在word中doc与docx的区别是什么(整理)