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为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
PHP swfupload图片上传的实例代码
Sep 30 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
May 19 PHP
php绘制圆形的方法
Jan 24 PHP
PHP编写RESTful接口
Feb 23 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 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 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
javascript基本语法分析说明
2008/06/15 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
浅析JavaScript中的隐式类型转换
2013/12/05 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
js电话号码验证方法
2015/09/28 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
详解Python的Django框架中的中间件
2015/07/24 Python
Python生成密码库功能示例
2017/05/23 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
python 画函数曲线示例
2019/12/04 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
优秀求职自荐信怎样写
2013/12/18 职场文书
农民工工资支付承诺函
2014/03/31 职场文书
小区文明倡议书
2014/05/16 职场文书
避暑山庄导游词
2015/02/04 职场文书
欠条范文
2015/07/03 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
Python的三个重要函数详解
2022/01/18 Python
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫