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

(没有定义相应常量则不加载)

当然,我们也可以通过扩展配置来添加自己的配置文件

  1. // 加载扩展配置文件
  2. '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 设计思想的更多相关文章

  1. 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景

    最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...

  2. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

  3. 掌握 Cinder 的设计思想 - 每天5分钟玩转 OpenStack(46)

    上一节介绍了 Cinder 的架构,这节讨论 Cinder 个组件如何协同工作及其设计思想. 从 volume 创建流程看 cinder-* 子服务如何协同工作 对于 Cinder 学习来说,Volu ...

  4. javascript继承机制的设计思想(ryf)

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

  5. 09A-独立按键消抖实验01——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献   实验目的: 1.复习状态机的设计思想并以此为基础实现按键消抖 2.单bit异步信号同步化以及边沿检测 3.在激励文件中学会使用随机数发生函数$random 4.仿真模 ...

  6. 08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献   实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(fin ...

  7. FPGA重要设计思想

    FPGA重要设计思想   1.速度和面积互换原则.以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作. 3.串/并转换的思想. 高速数据处理的重要技巧之一. ...

  8. 模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数 字,求和之后输出结果,写出其的设计思想、程序流程图、源程序代码。

    一 设计思想 首先现在file中建立一个类,并把任务名和类名写上(注意类名的大写):第二步则是参数的输入,并且定义求和变量:第三步则是对参数数据类型的要求,要把字符类型转化为整数类型并输出(这也是本道 ...

  9. Businessworks的设计思想

    Businessworks的设计思想基于一下三篇ATA: <从Eclipse平台看交易平台化>,强调微内核和扩展机制实现 <Google Guice平台模块化开发的果汁>,讨论 ...

随机推荐

  1. 使用pm2常见问题

    一.日志 1.pm2 的log怎么查看?(安装pm2后默认日志的路径为~/.pm2/),可以通过pm2 show (name)来查看某个进程下的日志地址 2.修改日志的输出路径,通过写一个程序启动的配 ...

  2. TeeChart注册方法

  3. 2016.7.8 计算机网络复习要点第四章之地址解析协议ARP

    1.地址解析协议ARP:知道一个机器的IP地址,需要找到其相应的硬件地址:ARP协议的用途是为了从网络层使用的IP地址解析出在链路层使用的硬件地址: 2.由于是IP协议使用了ARP协议,因此通常就把A ...

  4. 2016.6.17 kali Linux 隧道工具

    隧道工具的基本概念: 1.在计算机网络中,隧道工具是指使用一种网络协议去封装另一种网络协议的技术. 2.通常用来数据伪装或者穿越防火墙,在入侵目标系统后,可用来提升权限和权限维持. Kali中的隧道工 ...

  5. safari的坑

    当将图片src设置为空字符的时候,图片仍然还在:

  6. 转-CSS3 圆角(border-radius)

    CSS3 圆角(border-radius)   前缀 例1 例2:无边框 书写顺序 其它 支持性 值:半径的长度 前缀 -moz(例如 -moz-border-radius)用于Firefox -w ...

  7. sqlserver2008使用设置sa用户登录步骤

    1.打开sql server 2008,使用windows身份验证. 2.成功登录后,点击安全性->登录名,“sa”右键选择属性,设置密码,勾选“强制密码实施策略”. 3.然后选择属性页下的“状 ...

  8. Codeforces Round #327 (Div. 2)

    题目传送门 水 A - Wizards' Duel 题目都没看清就写了,1e-4精度WA了一次... /************************************************ ...

  9. BZOJ4320 : ShangHai2006 Homework

    取$M=\sqrt{300000}$. 设$g[i]$表示程序员的$\bmod i$最小的值. 若$Y<M$,那么可以在$O(M)$时间内完成对所有$g[i]$的修改,$O(1)$时间内完成查询 ...

  10. BZOJ3067 : Hyperdrome

    设f[i][j]表示前i个字母中字母j出现的次数对2取模的结果. 若[l,r]经过重组可以形成回文串,则需满足f[l-1][j]与f[r][j]至多有1位不同. 将f[i]用一个long long表示 ...