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 相关文章推荐
substr()函数中文版
Oct 09 PHP
基于mysql的bbs设计(三)
Oct 09 PHP
PHP Google的translate API代码
Dec 10 PHP
PHP导入Excel到MySQL的方法
Apr 23 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
php 如何获取数组第一个值
Aug 06 PHP
php使用pdo连接mssql server数据库实例
Dec 25 PHP
php精确的统计在线人数的方法
Oct 21 PHP
php验证身份证号码正确性的函数
Jul 20 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
用PHP的反射实现委托模式的讲解
Mar 22 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
Apr 23 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 获取完整url地址
2008/12/20 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
Python Django Cookie 简单用法解析
2019/08/13 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
python 下划线的不同用法
2020/10/24 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
接口可以包含哪些成员
2012/09/30 面试题
村庄绿化方案
2014/05/07 职场文书
2014最新版群众路线四风整改措施
2014/09/24 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书