thinkphp控制器调度使用示例


Posted in PHP onFebruary 24, 2014

1.如何通过地址栏参数来得到模块名称和控制器名称(即使在有路由和开了重写模块的情况下)

2.tp是如何实现前置,后置方法功能模块,和如何执行带参数的方法?

php系统自带的 ReflectionClass,ReflectionMethod 类,可以反射用户自定义类的中属性,方法的权限和参数等信息,通过这些信息可以准确的控制方法的执行

ReflectionClass主要用的方法: 
hasMethod(string)  是否存在某个方法
getMethod(string)   获取方法

ReflectionMethod 主要方法: 
getNumberOfParameters()  获取参数个数
getParamters()  获取参数信息

3.代码演示

<?php 
class IndexAction{
 public function index(){
   echo 'index'."\r\n";
 }
 public function test($year=2012,$month=2,$day=21){
   echo $year.'--------'.$month.'-----------'.$day."\r\n";
 }
 public function _before_index(){
   echo __FUNCTION__."\r\n";
 }
 public function _after_index(){
   echo __FUNCTION__."\r\n";
 }
}
//执行index方法
$method = new ReflectionMethod('IndexAction','index');
//进行权限判断
if($method->isPublic()){
 $class = new ReflectionClass('IndexAction');
 //执行前置方法
 if($class->hasMethod('_before_index')){
  $beforeMethod = $class->getMethod('_before_index');
  if($beforeMethod->isPublic()){
   $beforeMethod->invoke(new IndexAction);
  }
 }
 $method->invoke(new IndexAction);
 //执行后置方法
 if($class->hasMethod('_after_index')){
  $beforeMethod = $class->getMethod('_after_index');
  if($beforeMethod->isPublic()){
   $beforeMethod->invoke(new IndexAction);
  }
 }
}

//执行带参数的方法
$method = new ReflectionMethod('IndexAction','test');
$params = $method->getParameters();
foreach($params as $param ){
 $paramName = $param->getName();
 if(isset($_REQUEST[$paramName]))
  $args[] = $_REQUEST[$paramName];
 elseif($param->isDefaultValueAvailable())
  $args[] = $param->getDefaultValue();
}
if(count($args)==$method->getNumberOfParameters())
 $method->invokeArgs(new IndexAction,$args);
else
 echo 'parameters is not match!';
PHP 相关文章推荐
PHP4和PHP5共存于一系统
Nov 17 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
Nov 23 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
php除数取整示例
Apr 24 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 PHP
PHP调试的强悍利器之PHPDBG
Feb 22 PHP
php解决DOM乱码的方法示例代码
Nov 20 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 #PHP
将php数组输出html表格的方法
Feb 24 #PHP
php格式化日期和时间格式化示例分享
Feb 24 #PHP
php目录操作实例代码
Feb 21 #PHP
php无限遍历目录示例
Feb 21 #PHP
php自动加载autoload机制示例分享
Feb 20 #PHP
php多文件上传下载示例分享
Feb 20 #PHP
You might like
PHP无限分类的类
2007/01/02 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
详解Python3中的Sequence type的使用
2015/08/01 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
自我反省检讨书
2014/01/23 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
会计学专业求职信
2014/07/17 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
个人承诺书格式范文
2015/04/29 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
学校教学工作总结2015
2015/05/19 职场文书
水知道答案观后感
2015/06/08 职场文书