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 相关文章推荐
example2.php
Oct 09 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
php购物车实现方法
Jan 03 PHP
php实现的xml操作类
Jan 15 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
php实现的网页版剪刀石头布游戏示例
Nov 25 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
Feb 28 PHP
PHP PDOStatement::fetch讲解
Jan 31 PHP
PHP创建XML接口示例
Jul 04 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
Swoole扩展的6种模式深入详解
Mar 04 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
php数组遍历类与用法示例
2019/05/24 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
jQuery动态添加
2016/04/07 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
商场中秋节活动方案
2014/02/07 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书