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 相关文章推荐
PHP5.3.1 不再支持ISAPI
Jan 08 PHP
javascript 小型动画组件与实现代码
Jun 02 PHP
PHP中文件上传的一个问题
Sep 04 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
php微信开发自定义菜单
Aug 27 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
浅谈PHP无限极分类原理
Mar 14 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
Dec 11 PHP
PHP页面静态化――纯静态与伪静态用法详解
Jun 05 PHP
laravel使用redis队列实例讲解
Mar 23 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取进制余数函数代码
2012/01/19 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php中的观察者模式简单实例
2015/01/20 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
js快速排序的实现代码
2013/12/08 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
python实现视频压缩功能
2020/12/18 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
2014年教师节寄语
2014/08/11 职场文书
医药销售自我评价200字
2014/09/11 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
退学证明范本3篇
2014/10/29 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
golang json数组拼接的实例
2021/04/28 Golang
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python