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. 环境强制准备太多,也影响运行速度。