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 相关文章推荐
一篇入门的php Class 文章
Apr 04 PHP
PHP 采集程序原理分析篇
Mar 05 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
PHP 二维数组根据某个字段排序的具体实现
Jun 03 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
Mar 04 PHP
Yii 2.0如何使用页面缓存方法示例
May 23 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
php变量与字符串的增删改查操作示例
May 07 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
文章推荐系统(二)
2006/10/09 PHP
PHP parse_url 一个好用的函数
2009/10/03 PHP
php除数取整示例
2014/04/24 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
$()JS小技巧
2007/07/21 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
Python字符串拼接的几种方法整理
2017/08/02 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
大学生职业生涯规划书汇总
2014/03/20 职场文书
幼儿园小班教师寄语
2014/04/03 职场文书
党的群众路线学习材料
2014/05/16 职场文书
新农村建设标语
2014/06/24 职场文书
委托书格式
2014/08/01 职场文书
报到证办理个人委托书
2014/10/06 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
收入证明申请书
2015/06/12 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL