运行原理

先来看下DoitPHP运行的流程图。

运行原理 - 图1

1、如上图所示:当访问者访问某URL页面时,如: http://www.example.com/index.php/post/show/page/1 (流程图第1步:网址请求),则项目入口文件index.php则建立一个应用(application)。代码如下:

  1. /**
  2. * 加载DoitPHP框架的初始化文件,如果必要可以修改文件路径
  3. */
  4. require_once APP_ROOT . '/doitphp/DoitPHP.php';
  5.  
  6. $config = APP_ROOT . '/application/config/application.php';
  7.  
  8. /**
  9. * 启动应用程序(网站)进程
  10. */
  11. Doit::run($config);

2、该应用(application)类中调用Router类中的getRequest()类方法来获得详细的用户请求信息,分析出用户所访问的URL中包含的控制器(Controller)名和带有Action行为标签的类方法(后文暂且称作Action)及参数等信息(流程图第2步:路由网址分析)。根据分析出的controller与action,程序则进行任务分发,运行分析出的controller文件中该action的业务代码(流程图第3步:任务分发)。代码如下:

  1. //创建一个页面控制器对象(Controller Object)
  2. $appObject = new $controller();
  3.  
  4. if (method_exists($controller, $action)){
  5. $_app[$appId] = $appObject->$action();
  6. } else {
  7. //所调用方法在所实例化的对象中不存在时
  8. self::_show404Error();
  9. }

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自动加载机制避免了程序运行时不需要的文件的加载, 及所需要文件的重复加载,是对提高程序运行效率大有裨益的。

原文: http://www.doitphp.com/index/documentation/?articleid=16