解析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 array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
php二分查找二种实现示例
Mar 12 PHP
PHP引用(&amp;)各种使用方法实例详解
Mar 20 PHP
php使用smtp发送支持附件的邮件示例
Apr 13 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
php比较相似字符串的方法
Jun 05 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
Laravel框架搜索分页功能示例
Feb 01 PHP
PHP封装XML和JSON格式数据接口操作示例
Mar 06 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
laravel与thinkphp之间的区别与优缺点
Mar 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数字格式化
2006/12/06 PHP
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
php 获取完整url地址
2008/12/20 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
document.addEventListener使用介绍
2014/03/07 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
爬山算法简介和Python实现实例
2014/04/26 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
使用Python读取大文件的方法
2018/02/11 Python
Python中常见的异常总结
2018/02/20 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python实现贪吃蛇双人大战
2020/04/18 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
《可爱的动物》教学反思
2014/02/22 职场文书
2014国培学习感言
2014/03/05 职场文书
挂靠协议书范本
2014/04/22 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书