解析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冒泡排序算法代码详细解读
Jul 17 PHP
php遍历所有文件及文件夹的方法深入解析
Jun 08 PHP
destoon各类调用汇总
Jun 20 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
CI框架常用方法小结
May 17 PHP
Yii配置与使用memcached缓存的方法
Jul 13 PHP
Yii中的cookie的发送和读取
Jul 27 PHP
PHP弱类型语言中类型判断操作实例详解
Aug 10 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 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使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
jQuery html()等方法介绍
2009/11/18 Javascript
JavaScript 基础篇(一)
2012/03/30 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
js实现左右轮播图
2020/01/09 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
python机器人行走步数问题的解决
2018/01/29 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
python super的使用方法及实例详解
2019/09/25 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
通信工程毕业生求职信
2013/11/16 职场文书
高三毕业生自我鉴定
2013/12/20 职场文书
买卖车协议书
2014/04/21 职场文书
借款担保书范文
2014/05/13 职场文书
单位接收函格式
2015/01/30 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
Python 匹配文本并在其上一行追加文本
2022/05/11 Python
MySQL数据库 任意ip连接方法
2022/05/20 MySQL
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android