解析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 相关文章推荐
我的论坛源代码(二)
Oct 09 PHP
PHP 函数学习简单小结
Jul 08 PHP
解析php防止form重复提交的方法
Jul 01 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
Jul 02 PHP
php获取新浪微博数据API实例
Nov 12 PHP
php更新修改excel中的内容实例代码
Feb 26 PHP
php导出excel格式数据问题
Mar 11 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
php实现通过ftp上传文件
Jun 19 PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
分析php://output和php://stdout的区别
May 06 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的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
解javascript 混淆加密收藏
2009/01/16 Javascript
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
Javascript 继承实现例子
2009/08/12 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Django实现celery定时任务过程解析
2020/04/21 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
介绍一下gcc特性
2015/10/31 面试题
初中体育教学反思
2014/01/14 职场文书
晨会主持词
2014/03/17 职场文书
离婚协议书范本样本
2014/08/19 职场文书
暑假学习心得体会
2014/09/02 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
2015年派出所工作总结
2015/04/24 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
病房管理制度范本
2015/08/06 职场文书