3.5 运行原理
先来看下DoitPHP运行的流程图。
1、如上图所示:当访问者访问某URL页面时,如: http://www.example.com/index.php/post/show/page/1(流程图第1步:网址请求),则项目入口文件index.php则建立一个应用(application)。代码如下:
/**
* 定义项目所在路径(根目录):APP_ROOT
*/
define('APP_ROOT', dirname(__FILE__));
/**
* 加载DoitPHP框架的初始化文件,如果必要可以修改文件路径
*/
require_once APP_ROOT . '/doitphp/App.php';
$configFile = APP_ROOT . '/application/config/application.php';
/**
* 启动应用程序(网站)进程
*/
App::run($configFile);
2、该应用(application)类中调用Router类中的getRequest()类方法来获得详细的用户请求信息,分析出用户所访问的URL中包含的控制器(Controller)名和带有Action行为标签的类方法(后文暂且称作Action)及参数等信息(流程图第2步:路由网址分析)。根据分析出的controller与action,程序则进行任务分发,运行分析出的controller文件中该action的业务代码(流程图第3步:任务分发)。代码如下:
//创建一个页面控制器对象(Controller Object)
$controller = 'controllers\\' . $controller . 'Controller';
$appObject = new $controller();
if (method_exists($controller, $action)){
$_app[$appId] = $appObject->$action();
} else {
//所调用方法在所实例化的对象中不存在时
self::_showNotFound();
}
3、分发到“任务”的controller中的action类方法开始执行。其中关于数据库业务逻辑这部分则调用model模块来完成(流程图第4步:Model调用),关于第三方程序则调用扩展(extension)来实现(流程图第4步:extension调用),关于视图业务逻辑的则调用视图模块来完成(流程图第5步:视图调用)。而视图这部分代码运行时,又会调用布局视图(layout)及挂件(widget)来完成这部分代码的处理(流程图第6步:布局视图调用及流程图第7步:挂件调用),最后显示网页。于是乎,访问者就会看到他所访问URL的页面内容了(流程图第8步:内容显示)。
注:程序运行过程中应用目录(application)中所有的控制器、模型、挂件、扩展等文件及doitphp框架中内核目录(core)和扩展库目录(library)内的文件,程序均自动加载。对这部分文件无需进行文件引入(include 或 require)。实现代码如下:
spl_autoload_register(array('AutoLoad', 'loadClass'));
即:SPL的自动加载机制。其原理为:如果当程序需要一个model文件时,程序没有找到该model文件,则会激发SPL自动加载机制,根据AutoLoad类中类方法loadClass所设计的程序流程来自动加载该model文件。如果不需要该model文件SPL自动加载机制不会自动激发,因此model文件也不会加载。所以,并不是PHP初学者,或对PHP SPL函数缺乏了解者所认为的,运行一个页面程序将所有的model、controller、等文件全部都加载了,从而影响效率。非也,非也,恰恰相反,SPL自动加载机制避免了程序运行时不需要的文件的加载, 及所需要文件的重复加载,是对提高程序运行效率大有裨益的。