thinkphp 设计思想
thinkphp 运行机制:
thinkphp首先设置一些常量、然后运行Think对象(系统环境),装载think的运行环境,包括:自动加载、异常处理、功能核心等。环境准备好后,运行App对象(应用程序),App对象会调用调度者(dispatcher)解析用户请求,然后通过反射机制实现控制器的访问(控制器的前置操作和后置操作),控制器中,通过自动加载机制访问model和其他层的功能,通过display调用View(视图类),渲染视图。具体情况如下图:

应用模式和状态:
应用模式可以支持不同运行环境的切换。我们只需要配置不同环境独立的配置文件,然后设置相应的常量便可。
应用模式设置常量APP_MODE:define(‘APP_MODE’,‘sae’);
状态配置设置常量APP_STATUS:define(‘APP_STATUS’,‘office’)
thinkphp配置文件的加载顺序:
ThinkPHP/Conf/convention.php
Application/Common/Conf/config.php
Application/Common/Conf/config_应用模式名称.php
ThinkPHP/Conf/debug.php
Application/Common/Conf/debug.php
Application/Common/Conf/office.php //状态配置
Application/当前模块名/Conf/config.php
Application/当前模块名/Conf/config_应用模式名称.php
Application/当前模块名/Conf/应用状态.php
(没有定义相应常量则不加载)
当然,我们也可以通过扩展配置来添加自己的配置文件
// 加载扩展配置文件'LOAD_EXT_CONFIG' => 'user,db',
多层MVC:
模块化设计思想。也是主要运用thinkphp的原因。thinkphp是模块/控制器/操作:Movice/Index/index的理念,他可以先分大的模块,模块里面在实现独立的mvc,当然模块里面还可以实现复杂的逻辑层、数据层等复杂结构的划分,
只需要通过D函数加参数访问,如:D(‘UserLogic’, ‘Logic’)访问的就是逻辑层。


驱动机制:
驱动思想的添加,让我们可以在框架上扩展自己的引擎实现。我们只需要在config里面配置相应的选项,就可以实现自己的引擎实现。类似于工厂模式。驱动机制的结构如图:

下面是一个模板引擎扩展的示例:

文件内容:
twig是一个模板分离引擎,我们把源文件放到vendor文件夹里面,在template/drvier下创建twig,并实现fetch功能,就制作好了新的模板驱动,此时,我们在配置文件中设置:’TMPL_ENGINE_TYPE’ =>’Twig’,就可以用twig模板引擎了。详见:http://blog.bmtx.cn/index.php/2014/12/21/4/
钩子机制:
类似于观察者模式。通过配置文件,把行为挂到Hook类上,然后,当代码出发钩子的标签时,运行挂在到该标签上的所有行为。如下图:

这种思路的加入,可以打破程序死板流程的限制,做一些独立行为,通过此种方式调用。
CBD模式:
核心—行为-驱动的分层。就是上面说的钩子机制和驱动机制,整个框架按照这三块来分层,以便提供比较多的可扩展方式。
thinkphp的问题:
1.架构不灵活。thinkphp自己实现了全自动化运行,这样导致,你必须按照他的解析流程运行代码,在他规定的框架内实现,有很大的局限性,例如单元测试的添加,新的运行流程的实现,
2.大量使用全局常量。thinkphp中大量使用了全局常量,这导致使用它的类依托于全局变量的设置,损失了类本身的封装性,造成比较高的耦合态。
3. 细节代码质量不高。thinkphp作为一个框架,整体架构设计还是挺合理的,但具体代码写的真是水平不高。建议好好研究细化。
4. 环境强制准备太多,也影响运行速度。
thinkphp 设计思想的更多相关文章
- 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
- 掌握 Cinder 的设计思想 - 每天5分钟玩转 OpenStack(46)
上一节介绍了 Cinder 的架构,这节讨论 Cinder 个组件如何协同工作及其设计思想. 从 volume 创建流程看 cinder-* 子服务如何协同工作 对于 Cinder 学习来说,Volu ...
- javascript继承机制的设计思想(ryf)
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
- 09A-独立按键消抖实验01——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的: 1.复习状态机的设计思想并以此为基础实现按键消抖 2.单bit异步信号同步化以及边沿检测 3.在激励文件中学会使用随机数发生函数$random 4.仿真模 ...
- 08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(fin ...
- FPGA重要设计思想
FPGA重要设计思想 1.速度和面积互换原则.以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作. 3.串/并转换的思想. 高速数据处理的重要技巧之一. ...
- 模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数 字,求和之后输出结果,写出其的设计思想、程序流程图、源程序代码。
一 设计思想 首先现在file中建立一个类,并把任务名和类名写上(注意类名的大写):第二步则是参数的输入,并且定义求和变量:第三步则是对参数数据类型的要求,要把字符类型转化为整数类型并输出(这也是本道 ...
- Businessworks的设计思想
Businessworks的设计思想基于一下三篇ATA: <从Eclipse平台看交易平台化>,强调微内核和扩展机制实现 <Google Guice平台模块化开发的果汁>,讨论 ...
随机推荐
- oracle的关闭过程(各个模式关闭)
关闭数据库与实例 与数据库启动一下,关闭数据库与实例也分为3步:关闭数据库-->实例卸载数据库--->终止实例. 1.Nomal(正常关闭方式) 命令:shutdown nomal 讲解: ...
- js event 2
js event 2 浏览器兼容 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- C调Lua
转自:http://foredoomed.org/blog/2013/12/07/integrate-c-with-lua/ 我们在用C写程序的时候,很多情况下需要用到List,Map等集合,但是C是 ...
- linux下Gnome桌面环境的安装
在实际工作中,无论是生产环境还是公司内部环境.很多时候装的linux系统都是最小化安装的.即没有桌面环境, 那么如果有时我们又需要一个桌面环境.该怎么安装呢?其实不难,现笔者将安装方法分享如下. 测试 ...
- BeagleBone Black项目实训手册(大学霸内部资料)
BeagleBone Black项目实训手册(大学霸内部资料) 介绍:本教程是<BeagleBone Black快速入门教程>的后续教程.本教程以项目操作为主,讲解LED项目.声音项目.传 ...
- 数据采集器移动手持打印POS终端(PDA)商超抄单方案-PDA抄单无线开单+进销存软件
PDA主要应用在业务员外出在超市能及时抄单发送回总公司,总公司办公人员及时在软件里面调出业务员的抄单数量进行配货,大大提供工作效率. 移动数据终端和无线基础架构相结合,面向零售与批发门店店员的解决方案 ...
- Tr A(矩阵快速幂)
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- POJ3321 Apple Tree(DFS序)
题目,是对一颗树,单点修改.子树查询.典型的dfs序入门题. DFS序可以将一颗树与子树们表示为一个连续的区间,然后用线段树来维护:感觉算是树链剖分的一种吧,和轻重链剖分不同的是这是对子树进行剖分的. ...
- HDU2841 Visible Trees(容斥原理)
题目..大概就是有个m*n个点的矩形从(1,1)到(m,n),问从(0,0)出发直线看过去最多能看到几个点. 如果(0,0)->(x,y)和(0,0)->(x',y')两个向量平行,那后面 ...
- WPF 碰撞检测
have tested this, it worked, at least for me var x1 = Canvas.GetLeft(e1); var y1 = Canvas.GetTop(e1) ...