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设计模式中工厂模式详细介绍
May 15 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
PHP中soap的用法实例
Oct 24 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
php排序算法实例分析
Oct 17 PHP
PHP执行shell脚本运行程序不产生core文件的方法
Dec 28 PHP
thinkPHP5.0框架API优化后的友好性分析
Mar 17 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
php中文语义分析实现方法示例
Sep 28 PHP
详解PHP中的8个魔术常量
Jul 06 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
重置版战役片段
2020/04/09 魔兽争霸
可以在线执行PHP代码包装修正版
2008/03/15 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
Python中的变量和作用域详解
2016/07/13 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
python3学生名片管理v2.0版
2018/11/29 Python
Django中modelform组件实例用法总结
2020/02/10 Python
Python configparser模块操作代码实例
2020/06/08 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
消防宣传口号
2014/06/16 职场文书
合作协议书模板2014
2014/09/26 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
instantclient客户端 连接oracle数据库
2022/04/26 Oracle