解析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 相关文章推荐
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
PHP文件上传主要代码讲解
Sep 30 PHP
个人写的PHP验证码生成类分享
Aug 21 PHP
php实现给图片加灰色半透明效果的方法
Oct 20 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
2014最热门的24个php类库汇总
Dec 18 PHP
php用ini_get获取php.ini里变量值的方法
Mar 04 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
PHP在线书签系统分享
Jan 04 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 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
php代码优化及php相关问题总结
2006/10/09 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
总裁秘书岗位职责
2013/12/04 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
黄石寨导游词
2015/02/05 职场文书