实例介绍PHP的Reflection反射机制


Posted in PHP onAugust 05, 2014

PHP5添加了一项新的功能:Reflection。这个功能使得程序员可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。
假设有一个类Person:

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;

 

        public function 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;

        }

}

通过ReflectionClass,我们可以得到Person类的以下信息:
1.常量 Contants
2.属性 Property Names
3.方法 Method Names
4.静态属性 Static Properties
5.命名空间 Namespace
6.Person类是否为final或者abstract

只要把类名"Person"传递给ReflectionClass就可以了:

$class = new ReflectionClass('Person');

获取属性(Properties):

$properties = $class->getProperties();

foreach($properties as $property) {

    echo $property->getName()."\n";

}

// 输出:

// _allowDynamicAttributes

// id

// name

// biography

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

$private_properties = $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()可以得到属性名,通过getDocComment可以得到写给property的注释。

foreach($properties as $property) {

    if($property->isProtected()) {

        $docblock = $property->getDocComment();

        preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);

        echo $matches[1]."\n";

    }

}

// Output:

// primary_autoincrement

// varchar

// text

有点不可思议了吧。竟然连注释都可以取到。
获取方法(methods):通过getMethods() 来获取到类的所有methods。返回的是ReflectionMethod对象的数组。不再演示。
最后通过ReflectionMethod来调用类里面的method。

$data = array("id" => 1, "name" => "Chris", "biography" => "I am am a PHP developer");

foreach($data as $key => $value) {

    if(!$class->hasProperty($key)) {

        throw new Exception($key." is not a valid property");

    }

 

    if(!$class->hasMethod("get".ucfirst($key))) {

        throw new Exception($key." is missing a getter");

    }

 

    if(!$class->hasMethod("set".ucfirst($key))) {

        throw new Exception($key." is missing a setter");

    }

 

    // Make a new object to interact with

    $object = new Person();

 

    // Get the getter method and invoke it with the value in our data array

    $setter = $class->getMethod("set".ucfirst($key));

    $ok = $setter->invoke($object, $value);

 

    // Get the setter method and invoke it

    $setter = $class->getMethod("get".ucfirst($key));

    $objValue = $setter->invoke($object);

 

    // Now compare

    if($value == $objValue) {

        echo "Getter or Setter has modified the data.\n";

    } else {

        echo "Getter and Setter does not modify the data.\n";

   }

}

有点意思吧。

PHP 相关文章推荐
在PHP3中实现SESSION的功能(二)
Oct 09 PHP
一个简单的PHP&MYSQL留言板源码
Jul 19 PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
php获取远程文件内容的函数
Nov 02 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 PHP
PHP DB 数据库连接类定义与用法示例
Mar 11 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 #PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 #PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 #PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 #PHP
linux下安装php的memcached客户端
Aug 03 #PHP
Linux下创建nginx脚本-start、stop、reload…
Aug 03 #PHP
Linux下php5.4启动脚本
Aug 03 #PHP
You might like
15种PHP Encoder的比较
2007/03/06 PHP
php 多线程上下文中安全写文件实现代码
2009/12/28 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
php实现微信扫码支付
2017/03/26 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
jQuery动画特效实例教程
2014/08/29 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
javascript实现动态标签云
2015/10/16 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
详解Node 定时器
2018/02/26 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
Python常用知识点汇总
2016/05/08 Python
详解python开发环境搭建
2016/12/16 Python
python机器学习之随机森林(七)
2018/03/26 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
Python 代码调试技巧示例代码
2020/08/11 Python
python 常见的反爬虫策略
2020/09/27 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
十八大报告观后感
2014/01/28 职场文书
爱耳日活动总结
2014/04/30 职场文书
售房协议书
2014/08/19 职场文书
五四青年节的活动方案
2014/08/20 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
电子商务实训报告总结
2014/11/05 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
JAVA springCloud项目搭建流程
2022/05/11 Java/Android