1.新建index.php
调用ThinkPHP.php文件
include "../../ThinkPHP/ThinkPHP.php";
2.读ThinkPHP.php文件
if(defined('ENGINE_NAME')) {
}else{
//没有定义ENGINE_NAME,直接else
if(!APP_DEBUG && is_file(RUNTIME_FILE)) {
// APP_DEBUG默认定义为false,默认执行开发模式
}else{
//修改APP_DEBUG为true,载入调试模式
require THINK_PATH.'Common/runtime.php'; //加载runtime.php文件
}
}
在index.php文件中修改APP_DEBUG
define("APP_DEBUG", true);
3.读runtime.php文件
defined('THINK_PATH') or exit(); //没有THINK_PHP直接退出,必须从入口文件走
if(version_compare(PHP_VERSION,'5.2.0','<')); //要求PHP版本大于5.2.0
Phpinfo(); //查看自己PHP版本
if(version_compare(PHP_VERSION,'5.4.0','<')) { //判断PHP版本是否小于5.4.0
ini_set('magic_quotes_runtime',0);
define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()?True:False); //在get等中加转义符号
}else{
}
define('IS_CGI',substr(PHP_SAPI, 0,3)=='cgi' ? 1 : 0 );
define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 ); //是否是window系统 1
define('IS_CLI',PHP_SAPI=='cli'? 1 : 0); //是否是命令行模式 0
声明许多常量信息
// 路径设置 可在入口文件中重新定义 所有路径常量都必须以/ 结尾
defined('CORE_PATH') or define('CORE_PATH', THINK_PATH.'Lib/'); // 系统核心类库目录
defined('EXTEND_PATH') or define('EXTEND_PATH', THINK_PATH.'Extend/'); // 系统扩展目录
defined('MODE_PATH') or define('MODE_PATH', EXTEND_PATH.'Mode/'); // 模式扩展目录
defined('ENGINE_PATH') or define('ENGINE_PATH', EXTEND_PATH.'Engine/'); // 引擎扩展目录
defined('VENDOR_PATH') or define('VENDOR_PATH', EXTEND_PATH.'Vendor/'); // 第三方类库目录
defined('LIBRARY_PATH') or define('LIBRARY_PATH', EXTEND_PATH.'Library/'); // 扩展类库目录
defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH.'Common/'); // 项目公共目录
defined('LIB_PATH') or define('LIB_PATH', APP_PATH.'Lib/'); // 项目类库目录
defined('CONF_PATH') or define('CONF_PATH', APP_PATH.'Conf/'); // 项目配置目录
defined('LANG_PATH') or define('LANG_PATH', APP_PATH.'Lang/'); // 项目语言包目录
defined('TMPL_PATH') or define('TMPL_PATH', APP_PATH.'Tpl/'); // 项目模板目录
defined('HTML_PATH') or define('HTML_PATH', APP_PATH.'Html/'); // 项目静态目录
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH.'Logs/'); // 项目日志目录
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH.'Temp/'); // 项目缓存目录
defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH.'Data/'); // 项目数据目录
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH.'Cache/'); // 项目模板缓存目录
加载系统核心类文件
load_runtime_file() {
require THINK_PATH.'Common/common.php'; //加载函数库文件ThinkPHP/Common
};
自动创建应用目录
// 检查项目目录结构 如果不存在则自动创建
if(!is_dir(LIB_PATH)) {
// 创建项目目录结构,默认没有,自动创建
build_app_dir();
}elseif(!is_dir(CACHE_PATH)){
// 检查缓存目录
check_runtime();
}elseif(APP_DEBUG){
// 调试模式切换删除编译缓存
if(is_file(RUNTIME_FILE)) unlink(RUNTIME_FILE);
}
Think::start(); //类文件调用自己的静态方法
4.这个类文件就是ThinkPHP/Lib/Core/Think.class.php
static function start() {
Think::buildApp(); //ThinkPHP/Lib/Core/Think.class.php下的buildApp()
App::run(); //ThinkPHP/Lib/Core/App.class.php下的run()
}
4.1.先运行buildApp()
Think::buildApp(
//先加载ThinkPHP/Conf/ convention.php
C(include THINK_PATH.'Conf/convention.php');
//再加载Shop/Conf/config.php
if(is_file(CONF_PATH.'config.php'))
)
ThinkPHP/Conf/convention.php
自己的项目/Conf/config.php,用户自己修改在config中配置各种参数。config.php文件覆盖convention.php文件,先加载convention.php再加载config.php。
再加载底层语言包
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
Think::buildApp()作用:引入相关配置文件
再运行App::run(); App类下的run()方法
5.ThinkPHP/Lib/Core/App.class.php
static public function run() {
// 项目初始化标签
tag('app_init');
App::init();
// 项目开始标签
tag('app_begin');
// Session初始化
session(C('SESSION_OPTIONS'));
// 记录应用初始化时间
G('initTime');
App::exec();
// 项目结束标签
tag('app_end');
return ;
}
5.1.执行自己类的静态方法,App::init();
static public function init() {
Dispatcher::dispath(); 分析路由
//分析路由(控制器MODEL_NAME,方法ACTION_NAME) 之前使用MVC index.php?c=控制器&a=方法
}
5.2.App::exec();方法
static public function exec() {
if(!preg_match('/^[A-Za-z](\w)*$/',MODULE_NAME)){ // 安全检测
$module = false;
}else{ //正常应该进入else
//创建Action控制器实例
$group = defined('GROUP_NAME') && C('APP_GROUP_MODE')==0 ? GROUP_NAME.'/' : '';
$module = A($group.MODULE_NAME);
//$module = new IndexAction; A方法是new方法,实例化对象
//控制器对象
}
if(!$module) {
//控制器没有对象
if(){
}
if(){
}else{
//有对象
}
}
try{
//控制器对象如何调用自己的相关方法
//$model -> $action();
$method = new ReflectionMethod($module, $action);
//控制器对象调用本身的方法
$model->invoke($model);
}
}
App::run()作用:控制器被实例化,控制器中的方法被执行