PHP中的reflection反射机制测试例子


Posted in PHP onAugust 05, 2014

Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射。尝试着用java的思想去理解php的反射,跟java基本上基本一致。参考了php手册:http://www.php.net/manual/zh/book.reflection.php。

ReflectTest.php:

<?php
 
class ReflectTest {
 
    /**
     * 用户ID
     */
    private $userId;
 
    /**
     * 用户名
     */
    private $userName;
 
    /**
     * 用户密码
     */
    private $password;
 
    /**
     * 用户邮箱
     */
    private $email;
 
    /**
     * 用户QQ号码
     */
    private $qq;
 
    /**
     * 登陆次数
     */
    private $loginTimes;
 
    public function ReflectTest(){
 
    }
 
    public function __construct($userId,$userName,$password){
        $this->userId = $userId;
        $this->userName = $userName;
        $this->password = $password;
    }
 
    /**
     *
     * @return the $userId
     */
    public function getUserId() {
        return $this->userId;
    }
 
    /**
     *
     * @return the $userName
     */
    public function getUserName() {
        return $this->userName;
    }
 
    /**
     *
     * @return the $password
     */
    public function getPassword() {
        return $this->password;
    }
 
    /**
     *
     * @return the $email
     */
    public function getEmail() {
        return $this->email;
    }
 
    /**
     *
     * @return the $qq
     */
    public function getQq() {
        return $this->qq;
    }
 
    /**
     *
     * @return the $loginTimes
     */
    public function getLoginTimes() {
        return $this->loginTimes;
    }
 
    /**
     *
     * @param field_type $userId            
     */
    public function setUserId($userId) {
        $this->userId = $userId;
    }
 
    /**
     *
     * @param field_type $userName          
     */
    public function setUserName($userName) {
        $this->userName = $userName;
    }
 
    /**
     *
     * @param field_type $password          
     */
    public function setPassword($password) {
        $this->password = $password;
    }
 
    /**
     *
     * @param field_type $email         
     */
    public function setEmail($email) {
        $this->email = $email;
    }
 
    /**
     *
     * @param field_type $qq            
     */
    public function setQq($qq) {
        $this->qq = $qq;
    }
 
    /**
     *
     * @param field_type $loginTimes            
     */
    public function setLoginTimes($loginTimes) {
        $this->loginTimes = $loginTimes;
    }
}
?>

Test.php:

<?php
  require_once 'ReflectTest.php';
  $ref = new ReflectTest("1", "admin", "admin888");//实例化ReflectTest
  echo "<h1>ReflectTest init.</h1><br/>UserId:".$ref->getUserId()."<br/>UserName:".$ref->getUserName()."<br/>Password:".$ref->getPassword();
  $class = new ReflectionClass('ReflectTest');//反射加载ReflectTest类
  $instance = $class->newInstanceArgs(array('123','root','123456'));//ReflectTest初始化
 
  echo "<h1>Field:</h1><br/>";
  $field = $class->getProperties();
  foreach($field as $f) {
    echo $f->getName()."<br/>";//反射输出所有的成员变量
  }
 
  echo "<h1>get Fields DocComment:</h1><br/>";
  foreach($field as $f) {
    $docComment = $f->getDocComment();//反射输出所有成员变量的文档注释
    echo $docComment."<br/>";
  }
 
  $method = $class->getMethods();//获取ReflectTest所有方法
  echo "<h1>get Methods DocComment:</h1><br/>";
  foreach($method as $m) {
    $docComment = $m->getDocComment();//获取所有方法的文档注释
    echo $docComment."<br/>";
 
  }
 
  echo "<h1>get Methods:</h1><br/>";
  foreach($method as $m) {
    $k = "get";//只调ReflectTest中的所有的get方法
    echo $m->getName()."=".($k === "" || strpos ( $m->getName (), $k ) === 0?$m->invoke($instance):"")."<br/>";
    if("setQq"==$m->getName()){
      $m->invoke($instance,'441637262');//调用setQq方法为ReflectTest当中的成员变量qq设值
    }
  }
 
  echo "<h1>Invoke (set/get)Qq result:</h1><br/>";
  $qq=$class->getmethod('getQq');//获取getQq方法
  echo "getQQ:".$qq->invoke($instance)."<br/>";//获取成员变量qq的值
  echo "3water.com";
?>

请求http://localhost/php/test/Test.php输出结果:

ReflectTest init.
 
UserId:1
UserName:admin
Password:admin888
Field:
 
userId
userName
password
email
qq
loginTimes
get Fields DocComment:
 
/** * 用户ID */
/** * 用户名 */
/** * 用户密码 */
/** * 用户邮箱 */
/** * 用户QQ号码 */
/** * 登陆次数 */
get Methods DocComment:
 
/** * * @return the $userId */
/** * * @return the $userName */
/** * * @return the $password */
/** * * @return the $email */
/** * * @return the $qq */
/** * * @return the $loginTimes */
/** * * @param field_type $userId */
/** * * @param field_type $userName */
/** * * @param field_type $password */
/** * * @param field_type $email */
/** * * @param field_type $qq */
/** * * @param field_type $loginTimes */
get Methods:
 
ReflectTest=
__construct=
getUserId=123
getUserName=root
getPassword=123456
getEmail=
getQq=
getLoginTimes=
setUserId=
setUserName=
setPassword=
setEmail=
setQq=
setLoginTimes=
Invoke (set/get)Qq result:
 
getQQ:441637262
3water.com
PHP 相关文章推荐
超级简单的发送邮件程序
Oct 09 PHP
php查看session内容的函数
Aug 27 PHP
PHP 变量的定义方法
Jan 26 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
使用php实现截取指定长度
Aug 06 PHP
PHP中把stdClass Object转array的几个方法
May 08 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
php事件驱动化设计详解
Nov 10 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 PHP
PHP中的异常处理机制深入讲解
Nov 10 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 #PHP
实例介绍PHP的Reflection反射机制
Aug 05 #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
You might like
根德YB400的电路分析
2021/03/02 无线电
网站当前的在线人数
2006/10/09 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
PHP 枚举类型的管理与设计知识点总结
2020/02/13 PHP
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
详解AngularJS1.x学习directive 中‘&amp; ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
在漏洞利用Python代码真的很爽
2007/08/26 Python
Python工程师面试必备25条知识点
2018/01/17 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
python 求定积分和不定积分示例
2019/11/20 Python
使用python求解二次规划的问题
2020/02/29 Python
keras之权重初始化方式
2020/05/21 Python
一文读懂Python 枚举
2020/08/25 Python
python实现发送邮件
2021/03/02 Python
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
大学生毕业自荐信
2013/10/10 职场文书
求职自荐信
2013/12/14 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
警用民用对讲机找不同
2022/02/18 无线电
MySQL数据库查询之多表查询总结
2022/08/05 MySQL
详解MySQL的内连接和外连接
2023/05/08 MySQL