作者:SNSGOU 发布于:2014-03-16 16:44:00 分类:PHP 浏览(6145)
PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。
反射是什么?
它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。
PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。
平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:
05 |
* For the sake of demonstration, we"re setting this private |
07 |
private $_allowDynamicAttributes = false; |
10 |
* type=primary_autoincrement |
15 |
* type=varchar length=255 null |
24 |
public function getId() { |
28 |
public function setId($v) { |
32 |
public function getName() { |
36 |
public function setName($v) { |
40 |
public function getBiography() { |
41 |
return $this->biography; |
44 |
public function setBiography($v) { |
45 |
$this->biography = $v; |
一、通过ReflectionClass,我们可以得到Person类的以下信息:
- 常量 Contants
- 属性 Property Names
- 方法 Method Names静态
- 属性 Static Properties
- 命名空间 Namespace
- Person类是否为final或者abstract
- Person类是否有某个方法
接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:
1 |
$class = new ReflectionClass('Person'); // 建立 Person这个类的反射类 |
2 |
$instance = $class->newInstanceArgs($args); // 相当于实例化Person 类 |
1)获取属性(Properties):
1 |
$properties = $class->getProperties(); |
2 |
foreach ($properties as $property) { |
3 |
echo $property->getName() . "\n"; |
6 |
// _allowDynamicAttributes |
默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:
1 |
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE); |
可用参数列表:
- ReflectionProperty::IS_STATIC
- ReflectionProperty::IS_PUBLIC
- ReflectionProperty::IS_PROTECTED
- ReflectionProperty::IS_PRIVATE
通过$property->getName()可以得到属性名。
2)获取注释:
通过getDocComment可以得到写给property的注释。
01 |
foreach ($properties as $property) { |
02 |
if ($property->isProtected()) { |
03 |
$docblock = $property->getDocComment(); |
04 |
preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches); |
05 |
echo $matches[1] . "\n"; |
09 |
// primary_autoincrement |
3)获取类的方法
- getMethods() 来获取到类的所有methods。
- hasMethod(string) 是否存在某个方法
- getMethod(string) 获取方法
4)执行类的方法:
1 |
$instance->getName(); // 执行Person 里的方法getName |
3 |
$method = $class->getmethod('getName'); // 获取Person 类中的getName方法 |
4 |
$method->invoke($instance); // 执行getName 方法 |
6 |
$method = $class->getmethod('setName'); // 获取Person 类中的setName方法 |
7 |
$method->invokeArgs($instance, array('snsgou.com')); |
二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:
- 是否“public”、“protected”、“private” 、“static”类型
- 方法的参数列表
- 方法的参数个数
- 反调用类的方法
2 |
$method = new ReflectionMethod('Person', 'test'); |
4 |
if ($method->isPublic() && !$method->isStatic()) { |
5 |
echo 'Action is right'; |
7 |
echo $method->getNumberOfParameters(); // 参数个数 |
8 |
echo $method->getParameters(); // 参数对象数组 |
- Groovy入门教程
Groovy入门教程 kmyhy@126.com 2009-5-13 一.groovy是什么 简单地说,Groovy 是下一代的java语言,跟java一样,它也运行在 JVM 中. 作为跑在JVM ...
- spring boot入门教程——Spring Boot快速入门指南
Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将使创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运 ...
- WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建
WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建 四月 4, 2019 作者:李超,音视频技术专家.本文首发于 RTC 开发者社区,欢迎在社区留言与作者交流. htt ...
- vue项目中使用ts(typescript)入门教程
最近项目需要将原vue项目结合ts的使用进行改造,这个后面应该是中大型项目的发展趋势,看到一篇不错的入门教程,结合它并进行了一点拓展记录之.本文从安装到vue组件编写进行了说明,适合入门. 1.引入T ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
- Content Security Policy 入门教程
阮一峰文章:Content Security Policy 入门教程
- gulp详细入门教程
本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...
随机推荐
- 连载:面向对象葵花宝典:思想、技巧与实践(33) - ISP原则
ISP,Interface Segregation Principle,中文翻译为"接口隔离原则". 和DIP原则一样,ISP原则也是大名鼎鼎的Martin大师提出来的,他在19 ...
- 在Docker中运行torch版的neural style
相关的代码都在Github上,请参见我的Github,https://github.com/lijingpeng/deep-learning-notes 敬请多多关注哈~~~ 在Docker中运行to ...
- 利用@media实现IE hack
虽然对IE深恶痛绝,却不能拒绝. 使用@media实现IE hack的方法,以记之. 仅IE6和IE7识别@media screen\9 { .selector { property: value; ...
- Windows平台字符的存储和输出分析
1. 引言 (写于2011-07-30) 在Windows NT系列的操作系统中最常用的两种字符集是ANSI和Unicode.ANSI是一种泛称,每一个国家或地区的ANSI编码都不一样,比如在Wind ...
- Object-c学习之路十(NSNumber&NSValue)
// // main.m // NSNumberAndNSValue // // Created by WildCat on 13-7-26. // Copyright (c) 2013年 wildc ...
- httpd-vhosts.conf的配置
<VirtualHost *:80> DocumentRoot "D:\product\web\Public" ServerName demo.web.com Dire ...
- XML巩固
一.XML基础 1.XML区分大小写, 2.XML属性值必须有引号(单引双引均可) 3.XML必须有根元素 4.一些特殊字符的需要用实体引用来替换 < < 小于 > > 大于 ...
- HTML5简单入门系列(六)
前言 之前几篇已经将HTML5的主要新增元素和特性简单介绍完毕,LZ一直在犹豫还要不要把其他元素也写出来,因为其实没什么东西可以写,就是自己用到时看一下就行.不过为了入门系列的完整,犹豫再三,还是决定 ...
- Array类型(一)
1.创建数组的基本方式有两种,第一种使用Array构造函数 使用Array构造函数时可以省略new操作符 2.第二种方式是使用数组字面量表示法 由于IE的实现与其他浏览器不一致,因此我们不赞同使用这个 ...
- 蘑菇街2015校招技术类笔试题A卷,回忆版(杭州站)
笔试时间:10月9号 下午 1.一串数据的最大递增序列,输出个数 例如 4,2, 6,3, 1,5, 最大递增序列为, 2,3, 5,输出3, 2.求两个整型数据集合的交集,尽可能少用时间. 假设两个 ...