浅谈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设计模式 Facade(外观模式)
Jun 26 PHP
PHP多个版本的分析解释
Jul 21 PHP
用PHP书写安全的脚本代码
Feb 05 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
浅谈php函数serialize()与unserialize()的使用方法
Aug 19 PHP
Joomla使用Apache重写模式的方法
May 04 PHP
PHP session会话操作技巧小结
Sep 27 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
Laravel框架源码解析之反射的使用详解
May 14 PHP
PHP7 新增功能
Mar 09 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
一个MYSQL操作类
2006/11/16 PHP
php heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
jquery $.ajax相关用法分享
2012/03/16 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
python列表的增删改查实例代码
2018/01/30 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
使用python远程操作linux过程解析
2019/12/04 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
华为慧通笔试题
2016/04/22 面试题
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
Python实现照片卡通化
2021/12/06 Python
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android