thinkPHP基于反射实现钩子的方法分析

本文实例讲述了thinkPHP基于反射实现钩子的方法。分享给大家供大家参考,具体如下:

ThinkPHP框架的控制器模块是如何实现 前控制器、后控制器,及如何执行带参数的方法?

PHP系统自带的 ReflectionClass、ReflectionMethod 类,可以反射用户自定义类的中属性,方法的权限和参数等信息,通过这些信息可以准确的控制方法的执行。

ReflectionClass:

主要用的方法:

hasMethod(string)  是否存在某个方法
getMethod(string)  获取方法

ReflectionMethod:

主要方法:

isPublic()    是否为 public 方法
getNumberOfParameters()  获取参数个数
getParamters()  获取参数信息
invoke( object $object [, mixed $parameter [, mixed $... ]] ) 执行方法
invokeArgs(object obj, array args)  带参数执行方法

实例演示

<?php class BlogAction { public function detail() { echo 'detail' . "\r\n"; } public function test($year = 2014, $month = 4, $day = 21) { echo $year . '--' . $month . '--' . $day . "\r\n"; } public function _before_detail() { echo __FUNCTION__ . "\r\n"; } public function _after_detail() { echo __FUNCTION__ . "\r\n"; } } // 执行detail方法 $method = new ReflectionMethod('BlogAction', 'detail'); $instance = new BlogAction(); // 进行权限判断 if ($method->isPublic()) { $class = new ReflectionClass('BlogAction'); // 执行前置方法 if ($class->hasMethod('_before_detail')) { $beforeMethod = $class->getMethod('_before_detail'); if ($beforeMethod->isPublic()) { $beforeMethod->invoke($instance); } } $method->invoke(new BlogAction); // 执行后置方法 if ($class->hasMethod('_after_detail')) { $beforeMethod = $class->getMethod('_after_detail'); if ($beforeMethod->isPublic()) { $beforeMethod->invoke($instance); } } } // 执行带参数的方法 $method = new ReflectionMethod('BlogAction', '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($instance, $args); } else { echo 'parameters is wrong!'; }

另一段代码参考

/** * 执行App控制器 */ public function execApp() { // 创建action控制器实例 $className = MODULE_NAME . 'Controller'; $namespaceClassName = '\\apps\\' . APP_NAME . '\\controller\\' . $className; load_class($namespaceClassName, false); if (!class_exists($namespaceClassName)) { throw new \Exception('Oops! Module not found : ' . $namespaceClassName); } $controller = new $namespaceClassName(); // 获取当前操作名 $action = ACTION_NAME; // 执行当前操作 //call_user_func(array(&$controller, $action)); // 其实吧,用这个函数足够啦!!! try { $methodInfo = new \ReflectionMethod($namespaceClassName, $action); if ($methodInfo->isPublic() && !$methodInfo->isStatic()) { $methodInfo->invoke($controller); } else { // 操作方法不是public类型,抛出异常 throw new \ReflectionException(); } } catch (\ReflectionException $e) { // 方法调用发生异常后,引导到__call方法处理 $methodInfo = new \ReflectionMethod($namespaceClassName, '__call'); $methodInfo->invokeArgs($controller, array($action, '')); } return; }

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

时间: 2025-01-27 14:58:17

thinkPHP基于反射实现钩子的方法分析的相关文章

基于网站优化的域名选择方法分析

中介交易 SEO诊断 淘宝客 云主机 技术大厅 就像企业的名称,产品的商标和服务的品牌一样,网站域名就是一个网站在互联网上的另一个品牌.好的域名如同好的公司名称一样,让人一下就记住,并能巧妙的融入企业所属行业,甚至产品名称等.很多人会说,相对于英文字母和阿拉伯数字而言,中文名字或者公司名称更好记.这个观点是正确无疑的,这样就必须提及我们文章所涉及的主题观点:基于网站优化的域名选择分析方法.就是从搜索引擎的角度而言,什么样的域名才是好的域名?或者说如何做,才能从网站优化的角度选择到合适的域名呢?

ThinkPHP基于PHPExcel导入Excel文件的方法_php实例

本文实例讲述了ThinkPHP基于PHPExcel导入Excel文件的方法.分享给大家供大家参考.具体方法如下: 主要知识点,用PHPExcel导入Excel数据经过这几天测试还是可以,xls,xlsx都可以获取Excel的数据. 下载地址:http://phpexcel.codeplex.com/ 开发思路: 1.先把Excel文件上传到服务器 2.获取服务器Excel文件内容 3.写入数据库 一.上传Excel文件,使用PHP里自带的上传方法 "\Think\Upload();",

基于thinkPHP框架实现留言板的方法

本文实例讲述了基于thinkPHP框架实现留言板的方法.分享给大家供大家参考,具体如下: 奋斗了一天,终于THINKPHP小邓留言版的概念版出来了 其实真的THINKPHP开发速度很快,作为一个互联网上"搬砖"的,从事这种 纯码农的事也是无可厚非的. 代码就实现了如下功能 1.留言功能. 2.验证功能. 3.分页显示功能. 就是写了几行代码(PS:页面设计代码不算,就算控制器和模型的代码) 下面我公布一下控制的器的代码,关于THINKPHP的代码规则我就不阐述了,看thinkphp手册

PHP基于反射机制实现插件的可插拔设计详解_php技巧

本文实例讲述了PHP基于反射机制实现插件的可插拔设计.分享给大家供大家参考,具体如下: 说PHP和ASP等同的朋友们可以就此打住了,PHP支持反射,而且还是非常的强大.好了,我们开始今天的话题. 功能描述: 页面拥有一个主导航菜单,里头有默认连接若干. 插件统一存放在一个目录,插件载入后会自动在导航菜单中增加上自己所需的链接. 插件载入时可执行一定的操作. 动态增删插件无需改动代码. 最终效果: 首页,插件1,插件2 "首页"是系统自带的菜单项."插件1"和&quo

完美解决thinkphp验证码出错无法显示的方法_php实例

本文实例讲述了完美解决thinkphp验证码出错无法显示的方法.分享给大家供大家参考.具体分析如下: 今天做到验证码这一块,想到tp自带验证图片,大喜,但鼓捣半天不出来,一直是个小 X的样子. 官方提示如下:如果无法显示验证码,请检查: ① PHP是否已经安装GD库支持: ② 输出之前是否有任何的输出(尤其是UTF8的BOM头信息输出): ③ Image类库是否正确导入: ④ 如果是中文验证码检查是否有拷贝字体文件到类库所在目录: 但是测试半天,不行!网上找来一个能用的方法,放到一个文件里执行可

Android基于反射技术实现的加减乘除运算示例_Android

本文实例讲述了Android基于反射技术实现的加减乘除运算.分享给大家供大家参考,具体如下: JAVA反射机制定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法

ThinkPHP简单使用memcache缓存的方法_php实例

本文实例讲述了ThinkPHP简单使用memcache缓存的方法.分享给大家供大家参考,具体如下: Thinkphp的默认缓存方式是以File方式,在/Runtime/Temp 下生成了好多缓存文件. 服务器装了memcached后想给更改成memecache方式 在Conf/config.php 中添加 'DATA_CACHE_TYPE' => 'Memcache', 'MEMCACHE_HOST' => 'tcp://127.0.0.1:11211', 'DATA_CACHE_TIME'

thinkPHP基于ajax实现的菜单与分页示例_php实例

本文实例讲述了thinkPHP基于ajax实现菜单与分页的方法.分享给大家供大家参考,具体如下: 一个分类菜单,使用ajax实现: function getid(id){ $.ajax({ url: "{:U('/Index/example')}", type: "POST", data: {id:id} }).success(function(data) { $("#centent").html(data); }); } 并使用ajax分页,这

thinkPHP中验证码的简单使用方法_php实例

本文实例讲述了thinkPHP中验证码的简单使用方法.分享给大家供大家参考,具体如下: 首先生成验证码,在action文件中,直接调用thinkphp中提供的方法即可生成,确保开启php的扩展 gd2 如下: class UserAction Model extends Model { /** * 显示验证码信息 */ public function verify() { ob_clean(); // 清空(擦掉)输出缓冲区 ,也就是清空前面的输出,通常情况下验证码不显示,可考虑这个问题 imp