浅谈PHP的反射机制


Posted in PHP onDecember 15, 2016

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 相关文章推荐
php访问查询mysql数据的三种方法
Oct 09 PHP
php中截取字符串支持utf-8
Jan 18 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
smarty模板引擎中变量及变量修饰器用法实例
Jan 22 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
PHP类的特性实例分析
Sep 28 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
Aug 06 PHP
php 三元运算符实例详细介绍
Dec 15 #PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Dec 14 #PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 #PHP
Thinkphp 中 distinct 的用法解析
Dec 14 #PHP
PHP 500报错的快速解决方法
Dec 14 #PHP
php json中文编码为null的解决办法
Dec 14 #PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 #PHP
You might like
Home Coffee Roasting
2021/03/03 咖啡文化
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
php实现读取内存顺序号
2015/03/29 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
微信小程序左右滑动的实现代码
2017/12/15 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
利用python发送和接收邮件
2016/09/27 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
Python定义一个Actor任务
2020/07/29 Python
python链表类中获取元素实例方法
2021/02/23 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
宠物店的创业计划书范文
2014/01/11 职场文书
员工评语大全
2014/01/19 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
抵押贷款承诺书
2014/05/30 职场文书
运动会800米赞词
2015/07/22 职场文书
交通事故协议书范本
2016/03/19 职场文书
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android