解析php中反射的应用


Posted in PHP onJune 18, 2013

一  反射的使用:

<?php
class Person{
 public $name;
 function __construct($name){
  $this->name=$name;
 }
}
interface Module{
 function execute();
}
class FtpModule implements Module{
 function setHost($host){
  print "FtpModule::setHost():$host\n";
 }
 function setUser($user){
  print "FtpModule::setUser():$user\n";
 }
 function execute(){
  //something
 }
}
class PersonModule implements Module{
 function setPerson(Person $person){
  print "PersonModule::setPerson:{$person->name}\n";
 }
 function execute(){
  //something
 }
}
class ModuleRunner{
 private $configData
        =array(
          "PersonModule"=>array('person'=>'bob'),
          "FtpModule"=>array('host'=>'example.com','user'=>'anon')
        );
 private $modules=array();
 function init(){
  $interface=new ReflectionClass('Module');
  foreach($this->configData as $modulename=>$params){
   $module_class=new ReflectionClass($modulename);//根据配置configData的名称,实例化ReflectionClass
   if(!$module_class->isSubclassOf($interface)){//检查反射得到了类是否是$interface的子类
    throw new Exception("unknown module type:$modulename");//不是Module子类则抛出异常
   }
   $module=$module_class->newInstance();//实例化一个FtpModule或者PersonModule对象
   foreach($module_class->getMethods() as $method){//获得类中的方法
    $this->handleMethod($module,$method,$params);
   }
   array_push($this->modules,$module);//将实例化的module对象放入$modules数组中
  }
 }
 function handleMethod(Module $module,ReflectionMethod $method,$params){
  $name=$method->getName();//获得方法名称
  $args=$method->getParameters();//获得方法中的参数
  if(count($args)!=1||substr($name,0,3)!="set"){//检查方法必须是以set开头,且只有一个参数
   return false;
  }
  $property=strtolower(substr($name,3));//讲方法名去掉set三个字母,作为参数
  if(!isset($params[$property])){//如果$params数组不包含某个属性,就返回false
   return false;
  }
  $arg_class=@$args[0]->getClass;//检查setter方法的第一个参数(且唯一)的数据类型
  if(empty($arg_class)){
   $method->invoke($module,$params[$property]);
  }else{
   $method->invoke($module,$arg_class->newInstance($params[$property]));
  }
 }
}
$test=new ModuleRunner();
$test->init();
?>

二  通过反射获得类中信息:
<PRE class=php name="code"><?php
class ReflectionUtil{
 static function getClassSource(ReflectionClass $class){
  $path=$class->getFileName();
  $lines=@file($path);
  $from=$class->getStartLine();
  $to=$class->getEndLine();
  $len=$to-$from+1;
  return implode(array_slice($lines,$from-1,$len));
 }
}
$classname="Person";
$path="../practice/{$classname}.php";
if(!file_exists($path)){
  throw new Exception("No such file as {$path}");
}
require_once($path);
if(!class_exists($classname)){
 throw new Exception("No such class as {$classname}");
}
print ReflectionUtil::getClassSource(new ReflectionClass('Person'));
?>
</PRE><BR>
<PRE></PRE>
结果是:class Person{ public $age; public $name; function getName(){return "zjx";} function getAge(){return 12;} function __toString(){ $rs=$this->getName(); $rs.="(age".$this->getAge().")"; return $rs; } }
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>

PHP 相关文章推荐
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
Sep 25 PHP
php学习之 认清变量的作用范围
Jan 26 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
PHP的PSR规范中文版
Sep 28 PHP
写一段简单的PHP建立文件夹代码
Jan 06 PHP
php.ini中的request_order推荐设置
May 10 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
PHP操作路由器实现方法示例
Apr 27 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
Jun 18 #PHP
解析smarty模板中类似for的功能实现
Jun 18 #PHP
smarty基础之拼接字符串的详解
Jun 18 #PHP
php class中public,private,protected的区别以及实例分析
Jun 18 #PHP
解析thinkphp基本配置 convention.php
Jun 18 #PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 #PHP
基于xcache的配置与使用详解
Jun 18 #PHP
You might like
再说下636单管机
2021/03/02 无线电
php数组(array)输出的三种形式详解
2013/06/05 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
分享20款好玩的jQuery游戏
2011/04/17 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
Python中input和raw_input的一点区别
2014/10/21 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
Python实现ATM系统
2020/02/17 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
保安拾金不昧表扬信
2014/01/15 职场文书
科研先进个人典型材料
2014/01/31 职场文书
趣味运动会策划方案
2014/06/02 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
出国签证在职证明
2014/09/20 职场文书
2015年司法所工作总结
2015/04/27 职场文书
班主任寄语2016
2015/12/04 职场文书
python 实现定时任务的四种方式
2021/04/01 Python