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运行模式的深入理解
Jun 03 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
PHP实现ftp上传文件示例
Aug 21 PHP
html静态页面调用php文件的方法
Nov 13 PHP
PHP获取当前日期和时间及格式化方法参数
May 11 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
php语言的7种基本的排序方法
Dec 28 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
php layui实现前端多图上传实例
Jul 30 PHP
php pdo连接数据库操作示例
Nov 18 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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
域名查询代码公布
2006/10/09 PHP
PHP二维数组的去重问题解析
2011/07/17 PHP
php实现word转html的方法
2016/01/22 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
JavaScript For Beginners(转载)
2007/01/05 Javascript
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
深入理解Javascript中的this关键字
2015/03/27 Python
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
python在指定目录下查找gif文件的方法
2015/05/04 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
python3爬取torrent种子链接实例
2020/01/16 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
2014年庆元旦活动方案
2014/02/15 职场文书
师德演讲稿范文
2014/05/06 职场文书
银行求职信范文
2014/05/26 职场文书
药店促销活动总结
2014/07/10 职场文书
决心书格式及范文
2019/06/24 职场文书
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技