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开发环境配置记录
Jan 14 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
Sep 09 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 PHP
CI框架支持$_GET的两种实现方法
May 18 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
php实现的二分查找算法示例
Jun 20 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
docker-compose部署php项目实例详解
Jul 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
打造计数器DIY三步曲(下)
2006/10/09 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
Ubuntu 16.04下安装PHP 7过程详解
2017/03/28 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
Jquery iframe内部出滚动条
2010/02/11 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
原生js实现日历效果
2020/03/02 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
js实现批量删除功能
2020/08/27 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Python 占位符的使用方法详解
2019/07/10 Python
对Django url的几种使用方式详解
2019/08/06 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
Python turtle库的画笔控制说明
2020/06/28 Python
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
集体婚礼证婚词
2014/01/13 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL