浅谈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函数
Dec 06 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
php支持中文字符串分割的函数
May 28 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 PHP
PHP框架自动加载类文件原理详解
Jun 06 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 PHP
php如何实现数据库的备份和恢复
Nov 30 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
php smarty函数扩展
2010/03/15 PHP
php防攻击代码升级版
2010/12/29 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
js html实现计算器功能
2018/11/13 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
Python使用贪婪算法解决问题
2019/10/22 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
公司财务管理制度
2015/08/04 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书