访问网站首页 index.php,跟着执行流程走一遍,细节不深究,碰到不太明白的变量,直接var_dump()输出看看:
1. index.php——首页入口页面,版本判定、是否开启调试、引入 ThinkPHP框架
路径:‘./index.php‘
判断PHP版本需是5.3.0以上:version_compare(PHP_VERSION,‘5.3.0‘,‘<‘);
系统调试设置:define(‘APP_DEBUG‘, true );
应用目录设置:define ( ‘APP_PATH‘, ‘./Application/‘ );
缓存目录设置:define ( ‘RUNTIME_PATH‘, ‘./Runtime/‘ );
引入ThinkPHP:require ‘./ThinkPHP/ThinkPHP.php‘;
2. ThinkPHP.php——ThinkPHP框架的入口文件,定义各种常量、判断系统环境,初始化应用
路径:‘./ThinkPHP/ThinkPHP.php‘
定义常量:版本号 THINK_VERSION、URL 模式定义(4 种模式)、类文件后缀 EXT、是否为SAE 环境、常用的系统路径常量(如Think类库目录、应用公共目录、缓存目录、配置目录等);
引入核心类Think.class.php:require CORE_PATH.‘Think‘.EXT;
应用初始化:Think\Think::start(); //命名空间\类名::方法(); //这里用到了命名空间
3. Think.class.php——框架的核心类,初始化应用程序,加载配置、类库,错误和异常处理,实例化对象
路径:‘./ThinkPHP/Library/Think/Think.class.php‘ 声明:Think\Think
start()方法:加载需用的类、配置、语言包,是否需要缓存,运行应用
①设定方法: spl_autoload_register(‘Think\Think::autoload‘); 自动加载类的方法,以及一些错误异常处理方法;
②分布式存储类初始化,用于读取、写入、删除文件;Storage::connect(STORAGE_TYPE);
③开发模式不缓存加载的核心类文件$runtimefile,用户模式将所有需引用的类并到同一个文件中缓存,加快后续访问速度。
④加载应用的配置文件、需要的函数和类文件、行文扩展等文件路径的数组$mode;include ‘./ThinkPHP/Mode/common.php‘
⑤循环加载处理$mode 数组中的各路径的文件;
⑥检查应用目录结构是否存在,不存在则会默认生成目录结构;(这个针对ThinkPHP新建一个应用,首次访问时使用)
⑦开始运行应用 App::run(); 即:‘./ThinkPHP/Library/Think/App.class.php‘
4. App.class.php——加载公共文件配置、URL解析、调用对应的控制器方法
路径:‘./ThinkPHP/Library/Think/App.class.php‘ 声明:Think\App
run()方法:
①App::init();
load_ext_file 加载应用的公共文件(./Application/Common/Common/)配置
(./Application/Common/Conf)
Think\Dispatcher::dispatch(); URL解析,获取控制器 index、方法 index
②App::exec(); 执行应用程序,及新建控制器HomeConstroller 的实例,即对象; 创建控制器实例:$module = controller(CONTROLLER_NAME,CONTROLLER_PATH);
即=new IndexController();
利用 php 反 射 机 制 获 取 action 方 法 对 象 , $method = new
\ReflectionMethod($module, $action);
执行这个方法:$method->invoke($module); //无参数时执行,访问首页默认执行这个
$method->invokeArgs($module,$args); //有参数时执行;
以上即执行了控制器 ./Application/Home/Controller/IndexController.class.php 中的index方法
5. IndexController.class.php——应用Home中默认首页 index的控制器
路径:./Application/Home/Controller/IndexController.class.php
index()方法:
$category = D(‘Category‘)->getTree(); // 调用 Category 模块
(./Application/Home/Model/CategoryModel.class.php)中的 getTree()方法,获取到站点栏目的数据;其中Category对应的是数据表名;
$lists = D(‘Document‘)->lists(null); //和上面一样 调用 DocumentModel.class.php中的lists()方法;
$this->assign(‘category‘,$category);// 将栏目数组数据分配给 category 标签
$this->display(); // 解 析 模 版 , 输 出 ; 模 版
(./Application/Home/View/default/Index/index.html)
到此,访问该站点首页的流程就结束,其中后台 admin.php和安装install.php的执行流程与之类似,这里就不做叙述了。其中用到一些直接调用的单个大写字母方法,都在这个公共函数文件中(./ThinkPHP/Common/functions.php)。