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 相关文章推荐
支持php4、php5的mysql数据库操作类
Jan 10 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
php合并js请求的例子
Nov 01 PHP
Php header()函数语法及使用代码
Nov 04 PHP
php结合ajax实现赞、顶、踩功能实例
May 12 PHP
php实现webservice实例
Nov 06 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
分享五个PHP7性能优化提升技巧
Dec 07 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
Jan 12 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
May 17 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
Oct 12 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
paypal即时到账php实现代码
2010/11/28 PHP
php实现的AES加密类定义与用法示例
2018/01/29 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
在Python中使用异步Socket编程性能测试
2014/06/25 Python
Python深入学习之上下文管理器
2014/08/31 Python
python制作websocket服务器实例分享
2016/11/20 Python
python实现简单神经网络算法
2018/03/10 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
档案检查欢迎词
2014/01/13 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
物业品质提升方案
2014/06/08 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
2016年感恩节寄语
2015/12/07 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
PHP 时间处理类Carbon
2022/05/20 PHP