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脚本的10个技巧(2)
Oct 09 PHP
缓存技术详谈―php
Dec 14 PHP
经典的PHPer为什么被认为是草根?
Apr 02 PHP
PHP中include()与require()的区别说明
Mar 10 PHP
PHP JSON 数据解析代码
May 26 PHP
php权重计算方法代码分享
Jan 09 PHP
php从数组中随机选择若干不重复元素的方法
Mar 14 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
Nov 23 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
Sep 02 PHP
微信公众号开发之获取位置信息php代码
Jun 13 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 301转向实现代码
2008/09/18 PHP
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
JS求平均值的小例子
2013/11/29 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python使用marshal模块序列化实例
2014/09/25 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
python解包概念及实例
2021/02/17 Python
西班牙手机之家:Phone House
2018/10/18 全球购物
写出一个方法实现冒泡排序
2016/07/08 面试题
工厂保洁员岗位职责
2013/12/04 职场文书
给儿子的表扬信
2014/01/15 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
爱之链教学反思
2014/04/30 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
行政诉讼答辩状
2015/05/21 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
php去除deprecated的实例方法
2021/11/17 PHP
Go 中的空白标识符下划线
2022/03/25 Golang