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 删除无限级目录与文件代码共享
Nov 22 PHP
用PHP读取flv文件的播放时间长度
Sep 03 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
解析php中heredoc的使用方法
Jun 17 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
Dec 17 PHP
在Debian系统下配置LNMP的教程
Jul 09 PHP
Yii2中如何使用modal弹窗(基本使用)
May 30 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
May 17 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 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
初学CAKEPHP 基础教程
2009/11/02 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
Python自动化开发学习之三级菜单制作
2017/07/14 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
学校后勤人员职责
2013/12/27 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
社区春季防火方案
2014/06/02 职场文书
舞蹈专业求职信
2014/06/13 职场文书
音乐学专业求职信
2014/07/22 职场文书
安阳殷墟导游词
2015/02/10 职场文书
会计求职自荐信
2015/03/26 职场文书
校园广播稿范文
2015/08/19 职场文书
Windows7下FTP搭建图文教程
2022/08/05 Servers