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开发文件系统实例讲解
Oct 09 PHP
PHP开发中常用的8个小技巧
Aug 27 PHP
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
PHP的SQL注入过程分析
Jan 06 PHP
php重定向的三种方法分享
Feb 22 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
php操作MongoDB类实例
Jun 17 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
PHP 匿名函数与注意事项详细介绍
Nov 26 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 PHP
PDO::_construct讲解
Jan 27 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
php从字符串创建函数的方法
2015/03/16 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
npm qs模块使用详解
2020/02/07 Javascript
js+audio实现音乐播放器
2020/09/13 Javascript
Python之PyUnit单元测试实例
2014/10/11 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
荷兰本土平价百货:HEMA
2017/10/23 全球购物
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
墨西哥网上超市:Superama
2018/07/10 全球购物
物业电工岗位职责
2013/11/20 职场文书
幼儿园教师辞职信
2014/01/18 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
索尼ICF-36收音机评测
2022/04/30 无线电
redis protocol通信协议及使用详解
2022/07/15 Redis
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers