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 相关文章推荐
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
PHP 验证登陆类分享
Mar 13 PHP
php判断一个数组是否为有序的方法
Mar 27 PHP
微信access_token的获取开发示例
Apr 16 PHP
php中get_defined_constants函数用法实例分析
May 12 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
Oct 13 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 PHP
PHP registerXPathNamespace()函数讲解
Feb 03 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 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
图书管理程序(一)
2006/10/09 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
php策略模式简单示例分析【区别于工厂模式】
2019/09/25 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
[52:03]Secret vs VG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
Python实用日期时间处理方法汇总
2015/05/09 Python
Python 多线程的实例详解
2017/09/07 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
文明学生标兵事迹
2014/01/21 职场文书
求职面试个人自我评价
2014/02/28 职场文书
房产转让协议书
2014/04/11 职场文书
邀请函怎么写
2015/01/30 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
计算机实训心得体会
2016/01/14 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
Docker官方工具docker-registry案例演示
2022/04/13 Servers
linux目录管理方法介绍
2022/06/01 Servers