热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP应用形式扩展之谜

ThinkPHP应用模式扩展之谜    ThinkPHP应用模式提供了对核心框架进行改造的机会,可以让你的应用适应更多的环境和不同的需求。每个应用模式都有自己的模式定义文件,相对与ThinkPHP3.1版本,ThinkPHP3.2版本对应用模式的扩展更加明确和清晰,在ThinkPHP3.1版本中定义了Cli、
ThinkPHP应用模式扩展之谜

ThinkPHP应用模式提供了对核心框架进行改造的机会,可以让你的应用适应更多的环境和不同的需求。每个应用模式都有自己的模式定义文件,相对与ThinkPHP3.1版本,ThinkPHP3.2版本对应用模式的扩展更加明确和清晰,在ThinkPHP3.1版本中定义了Cli、Lite、Thin、AMF、PHPRPC、REST模式,其定义方式和ThinkPHP3.2版本的方式大同小异,如有需要可以参考修改,其中Cli模式被ThinkPHP框架内置,不用单独定义Cli模式即可正常使用,如需要更细化调整可以参考3.1版编写的Cli运行模式扩展。ThinkPHP同样提供了便捷的开发环境和正式环境的模式切换方式。让我们随着ThinkPHP的运行流程解析其应用模式扩展之谜。

一、应用模式的使用

在研究应用模式扩展之前,看看如何使用应用模式的吧。一般通过在入口文件定义常量APP_MODE为应用模式名称,但是在分析ThinkPHP框架入口文件时,了解到框架默认采用模式为普通模式(common),而且可以自动识别sae环境,当然前提是没有定义APP_MODE常量时,当然ThinkPHP可以自动识别CLI和CGI模式,并且在CLI和CGI环境下运行ThinkPHP框架在默认模式中自动对这两种环境做了细微调整,当然也可以自己扩展这两种应用模式。

if(function_exists('saeAutoLoader')){// 自动识别SAE环境    defined('APP_MODE')     or define('APP_MODE',      'sae');    defined('STORAGE_TYPE') or define('STORAGE_TYPE',  'Sae');}else{    defined('APP_MODE')     or define('APP_MODE',       'common'); // 应用模式 默认为普通模式       defined('STORAGE_TYPE') or define('STORAGE_TYPE',   'File'); // 存储类型 默认为File   }


二、应用模式定义

在ThinkPHP框架当中除了ThinkPHP框架入口和框架引导类以外,基本所有其他功能都可以通过应用模式进行更改和扩展,如果我们要增加一个应用模式,只需要在ThinkPHP\Mode目录下面定义一个模式定义文件即可,我们可以通过分析common模式进行学习。

//文件路径:ThinkPHP/Mode/common.php/** * ThinkPHP 普通模式定义 * 定义一个模式文件,只需要返回一个模式包含文件的数组即可 * 在数组中主要包含4种扩展文件列表: *     config 为默认加载配置文件列表 *     alias  为核心类库别名配置列表 *     core 需要加载的核心函数和类文件列表 *     tags 行为配置列表 * * 如果在应用模式定义中加载一个自定类,那个自定义类的命名空间必须是Think */return array(    // 配置文件    'config'    =>  array(        THINK_PATH.'Conf/convention.php',   // 系统惯例配置        CONF_PATH.'config.php',      // 应用公共配置    ),     // 别名定义    'alias'     =>  array(        'Think\Log'               => CORE_PATH . 'Log'.EXT,        'Think\Log\Driver\File'   => CORE_PATH . 'Log/Driver/File'.EXT,        'Think\Exception'         => CORE_PATH . 'Exception'.EXT,        'Think\Model'             => CORE_PATH . 'Model'.EXT,        'Think\Db'                => CORE_PATH . 'Db'.EXT,        'Think\Template'          => CORE_PATH . 'Template'.EXT,        'Think\Cache'             => CORE_PATH . 'Cache'.EXT,        'Think\Cache\Driver\File' => CORE_PATH . 'Cache/Driver/File'.EXT,        'Think\Storage'           => CORE_PATH . 'Storage'.EXT,    ),     // 函数和类文件    'core'      =>  array(        THINK_PATH.'Common/functions.php',        COMMON_PATH.'Common/function.php',        CORE_PATH . 'Hook'.EXT,        CORE_PATH . 'App'.EXT,        CORE_PATH . 'Dispatcher'.EXT,        //CORE_PATH . 'Log'.EXT,        CORE_PATH . 'Route'.EXT,        CORE_PATH . 'Controller'.EXT,        CORE_PATH . 'View'.EXT,        BEHAVIOR_PATH . 'BuildLiteBehavior'.EXT,        BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT,        BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT,    ),    // 行为扩展定义    'tags'  =>  array(        'app_init'     =>  array(            'Behavior\BuildLiteBehavior', // 生成运行Lite文件        ),               'app_begin'     =>  array(            'Behavior\ReadHtmlCacheBehavior', // 读取静态缓存        ),        'app_end'       =>  array(            'Behavior\ShowPageTraceBehavior', // 页面Trace显示        ),        'view_parse'    =>  array(            'Behavior\ParseTemplateBehavior', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎        ),        'template_filter'=> array(            'Behavior\ContentReplaceBehavior', // 模板输出替换        ),        'view_filter'   =>  array(            'Behavior\WriteHtmlCacheBehavior', // 写入静态缓存        ),    ),);


我们看到这个普通应用模式代码之后,有点明了ThinkPHP的应用模式扩展是怎么回事了,但是还是知其然而不知其所以然,定义一个加载文件列表和配置是如何改变框架核心的呢?秘密就在ThinkPHPK引导类中,让我们再回顾以下吧!

//判断是否存在core.php配置文件(这是开发环境临时定义的运行模式,我是这么理解的)          //否者加载APP_MODE定义的模式文件          $mode   =   include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';          //加载模式中core定义的核心文件列表          foreach ($mode['core'] as $file){              if(is_file($file)) {                include $file;                if(!APP_DEBUG) $content   .= compile($file);              }          }           //加载模式中定义的config配置文件列表          foreach ($mode['config'] as $key=>$file){              is_numeric($key)?C(include $file):C($key,include $file);          }           // 读取当前应用模式对应的配置文件          if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.'.php'))              C(include CONF_PATH.'config_'.APP_MODE.'.php');            // 加载模式中alias别名列表定义          if(isset($mode['alias'])){              self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']);          }           // 加载应用别名定义文件          if(is_file(CONF_PATH.'alias.php'))              self::addMap(include CONF_PATH.'alias.php');           // 加载模式中tags行为定义          if(isset($mode['tags'])) {              Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);          }           // 加载应用行为定义          if(is_file(CONF_PATH.'tags.php'))              // 允许应用增加开发模式配置定义              Hook::import(include CONF_PATH.'tags.php');             // 加载框架底层语言包          L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');


通过ThinkPHP::start()中的这段代码,完美无缝关联的模式定义文件的意义与实现方法。

三、定义简单的运行模式

手册中有一个模式扩展到的实例,可以拿到这里来分析一下,定义一个lite简洁运行模式,首先在ThinkPHP/Mode目录下新建一个lite.php文件内容定义如下:

return array(   // 配置文件  'config'    =>  array(               THINK_PATH.'Conf/convention.php',     // 系统惯例配置               CONF_PATH.'config.php',      // 应用公共配置   ),  // 别名定义    'alias'     =>  array(              'Think\Exception'         => CORE_PATH . 'Exception'.EXT,              'Think\Model'             => CORE_PATH . 'Model'.EXT,               'Think\Db'                => CORE_PATH . 'Db'.EXT,              'Think\Cache'             => CORE_PATH . 'Cache'.EXT,              'Think\Cache\Driver\File' => CORE_PATH . 'Cache/Driver/File'.EXT,              'Think\Storage'           => CORE_PATH . 'Storage'.EXT, ),  // 函数和类文件    'core'      =>  array(             MODE_PATH.'Lite/functions.php',               COMMON_PATH.'Common/function.php',             MODE_PATH . 'Lite/App'.EXT,              MODE_PATH . 'Lite/Dispatcher'.EXT,              MODE_PATH . 'Lite/Controller'.EXT,             MODE_PATH . 'Lite/View'.EXT,             CORE_PATH . 'Behavior'.EXT, ),  // 行为扩展定义    'tags'  =>  array(              'view_parse'    =>  array(                     'Behavior\ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎               ),               'template_filter'=> array(                     'Behavior\ContentReplace', // 模板输出替换               ), ),);


从上面的配置当中我们发现core中的核心文件大多数都被替换了,当然这些需要被替换的程序功能需要我们自己去实现,不过建议大家直接拷贝普通模式中定义的核心文件过来修改。接下来我们来实现以下ThinkPHP应用开发中的核心类库扩展文件App.class.php

在ThinkPHP/Mode目录下建立一个Lite目录并在lite目录下建立App.class.php文件,以下是程序文件的实现:

//模式扩展类库必须是Think命名空间namespace Think; /** * ThinkPHP 应用程序类 执行应用过程管理 Lite模式扩展类 * 实现ThinkPHP核心类库扩展时,尽可能仿造原有类库实现(除非对ThinkPHP框架源码特别了解) * 因为在其他没有扩展的核心文件中可能会调用扩展的核心类文件中的某个方法,除非你打算全部扩展 */class App{/** * 应用程序初始化 * @access public * @return void */static public function init() {        //具体现实} /** * 执行应用程序 * @access public * @return void */static public function exec() {        //具体实现} /** * 运行应用实例 入口文件使用的快捷方法 * @access public * @return void */static public function run() {        //具体实现} static public function logo(){        //具体实现}}

当文件所有扩展文件的实现后,可以在框架入口文件定义APP_MODE常量为lite。

在这里吐槽以下官方:本节手册当中居然要定义MODE_NAME常量来改变运行模式,为了准确性无奈在ThinkPHP框架全部文件中搜索MODE_NAME,结果都没有才放下一个悬着的心。这是之前3.1版本中定义运行模式的方法,手册更新细节问题(声明一下我现在用的手册是3.2.12014年2月14日的版本)。



推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现。直接上代码usingQiniu.IO;usingQiniu.IO.Resumable;usingQiniu.RPC; ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • java布尔字段用is前缀_POJO类中布尔类型的变量都不要加is前缀详解
    前言对应阿里巴巴开发手册第一章的命名风格的第八条。【强制】POJO类中布尔类型的变量都不要加is前缀,否则部分框架解析会引起序列化错误。反例:定义为基本 ... [详细]
author-avatar
假爱多慌乱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有