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 相关文章推荐
给初学PHP的5个入手程序
Nov 23 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
PHP5中Cookie与 Session使用详解
Apr 30 PHP
解析PHP对现有搜索引擎的调用
Jun 25 PHP
如何使用PHP批量去除文件UTF8 BOM信息
Aug 05 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
destoon调用discuz论坛中带图片帖子的实现方法
Aug 21 PHP
thinkphp中ajax与php响应过程详解
Dec 08 PHP
PHP读取word文档的方法分析【基于COM组件】
Aug 01 PHP
php往mysql中批量插入数据实例教程
Dec 12 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
Oct 17 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
php查找字符串出现次数的方法
2014/12/01 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
js 获取服务器控件值的代码
2010/03/05 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
npm qs模块使用详解
2020/02/07 Javascript
vue开发移动端底部导航条功能
2020/04/08 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
Python实现学校管理系统
2018/01/11 Python
Python登录注册验证功能实现
2018/06/18 Python
python函数定义和调用过程详解
2020/02/09 Python
django 实现简单的插入视频
2020/04/07 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
python一些性能分析的技巧
2020/08/30 Python
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
护士在校生自荐信
2014/02/01 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸