• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 解析thinkPHP基于反射实现钩子的方法

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

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了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) 带参数执行方法


实例演示

<?phpclass 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;}


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • laravel与thinkphp之间的区别与优缺点
  • ThinkPhp5.1制作微信支付以及支付后的几种状态说明
  • ThinkPHP3.2.3如何从php5升级到php7
  • 详解thinkphp下部分内容的ajax无刷新分页
  • 你知道Thinkphp5.1让验证码在Electron-vue中怎么用?
  • 关于ThinkPHP的join关联查询不使用默认的表前缀
  • ThinkPHP5通过ajax插入图片并实时显示(完整代码)
  • 分析 thinkphp5 显示render不兼容问题
  • ThinkPHP5访问怎么去除/public/index.php
  • Thinkphp5.1详细讲解中间件的用法

相关文章

  • 2022-04-29宝塔linux面板之​一键安装ffmpeg命令
  • 2022-04-29Node.js中JSON格式和Excel格式的双向转换
  • 2022-04-29WordPress url链接去掉category的方法插件即可搞定
  • 2022-04-29避坑!Laravel数据库迁移功能的一个坑
  • 2022-04-29PHP网站常见安全漏洞,及相应防范措施总结
  • 2022-04-29Photoshop制作个性时尚的立体字教程
  • 2022-04-29Photoshop打造质感光效文字
  • 2022-04-29dedecms列表页图片加ALT描述的完美方式
  • 2022-04-29MySQL数据库的root密码忘记该怎么办
  • 2022-04-29可以同时删除字符串前导和尾部空白的函数是什么

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • Javascript怎么禁止事件冒泡
    • Photoshop制作透明大气的导航按钮
    • PHP中怎么将整型转化为字符串类型?
    • 网站上线前需要做的优化准备工作
    • Photoshop数位板人物设计教程:《主教MM》
    • 详解Laravel前端工程化之mix
    • 介绍Laravel unit test : 模拟认证的用户
    • 教你快速修改WordPress中已有的头像
    • 一文讲解ajax实现无刷新上传和下载(代码详解)
    • css中实现背景透明的三种方式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有