解析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中的 == 运算符进行字符串比较
Nov 26 PHP
在mysql数据库原有字段后增加新内容
Nov 26 PHP
win7下memCache的安装过程(具体操作步骤)
Jun 28 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
discuz目录文件资料汇总
Dec 30 PHP
关于PHP开发的9条建议
Jul 27 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
如何离线执行php任务
Feb 21 PHP
php实现留言板功能(会话控制)
May 23 PHP
PHP生成推广海报的方法分享
Apr 22 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
ThinkPHP 3使用OSS的方法
Jul 19 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php 引用(&amp;)详解
2009/11/20 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
vue内置指令详解
2018/04/03 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
竞选大队委员演讲稿
2014/04/28 职场文书
学习十八大的感悟
2015/08/11 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
浅谈Redis缓冲区机制
2022/06/05 Redis