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学习之PHP变量
Oct 09 PHP
php 魔术方法使用说明
Oct 20 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
Laravel框架表单验证详解
Sep 04 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
php微信开发之批量生成带参数的二维码
Jun 26 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
yii2 数据库读写分离配置示例
Feb 10 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 PHP
php+ajax实现文件切割上传功能示例
Mar 03 PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 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
php去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
js cookies实现简单统计访问次数
2009/11/24 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python标准库之Sys模块使用详解
2015/05/23 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
python 画函数曲线示例
2019/12/04 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
卫校护理专业毕业生求职信
2013/11/26 职场文书
自荐书封面下载
2013/11/29 职场文书
股权投资意向书
2014/04/01 职场文书
校庆团日活动总结
2014/08/28 职场文书
教育实习指导教师评语
2014/12/31 职场文书
复兴之路观后感
2015/06/02 职场文书
地震捐款简报
2015/07/21 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python