//1.入口文件 index.php
//首页入口文件
//检测PHP 环境
if (version_compare(PHP_VERSION, '5.3.0', '<')) die('require PHP > 5.3.0 !') ;
//是否开启调试模式
define('APP_DEBUG', true);
//定义应用目录
define('APP_PATH', './Application/');
//引入ThinkPHP框架
require './ThinkPHP/ThinkPHP.php';
// 2.ThinkPHP公共入口文件
// 记录开始运行时间
$GLOBALS['_beginTime'] = microtime(true);
// 记录内存初始使用
define('MEMORY_LIMIT_ON', function_exists('memory_get_usage'));
if (MEMORY_LIMIT_ON) {
$GLOBALS['_startUseMems'] = memory_get_usage();
}
// 版本信息
const THINK_VERSION = '3.2.4';
// URL 模式定义
const URL_COMMON = 0; //普通模式
const URL_PATHINFO = 1; //PATHINFO模式
const URL_REWRITE = 2; //REWRITE模式
const URL_COMPAT = 3; // 兼容模式
// 类文件后缀
const EXT = '.class.php';
// 系统常量定义
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . '/');
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . '/');
defined('APP_STATUS') or define('APP_STATUS', ''); // 应用状态 加载对应的配置文件
defined('APP_DEBUG') or define('APP_DEBUG', false); // 是否调试模式
if (function_exists('saeAutoLoader')) {
// 自动识别SAE环境
defined('APP_MODE') or define('APP_MODE', 'sae');
defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'Sae');
} else {
defined('APP_MODE') or define('APP_MODE', 'common'); // 应用模式 默认为普通模式
defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 存储类型 默认为File
}
// 系统运行时目录
defined('RUNTIME_PATH') or define('RUNTIME_PATH', APP_PATH . 'Runtime/');
// 系统核心类库目录
defined('LIB_PATH') or define('LIB_PATH', realpath(THINK_PATH . 'Library') . '/');
// Think类库目录
defined('CORE_PATH') or define('CORE_PATH', LIB_PATH . 'Think/');
// 行为类库目录
defined('BEHAVIOR_PATH') or define('BEHAVIOR_PATH', LIB_PATH . 'Behavior/');
// 系统应用模式目录
defined('MODE_PATH') or define('MODE_PATH', THINK_PATH . 'Mode/');
// 第三方类库目录
defined('VENDOR_PATH') or define('VENDOR_PATH', LIB_PATH . 'Vendor/');
// 应用公共目录
defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH . 'Common/');
// 应用配置目录
defined('CONF_PATH') or define('CONF_PATH', COMMON_PATH . 'Conf/');
// 应用语言目录
defined('LANG_PATH') or define('LANG_PATH', COMMON_PATH . 'Lang/');
// 应用静态目录
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/');
// 配置文件后缀
defined('CONF_EXT') or define('CONF_EXT', '.php');
// 配置文件解析方法
defined('CONF_PARSE') or define('CONF_PARSE', '');
defined('ADDON_PATH') or define('ADDON_PATH', APP_PATH . 'Addon');
// 系统信息
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
//当遇到反斜杆(\)、单引号(')、双引号(")这样一些的字符定入到数据库里,又不想被过滤掉,使用
//这个函数(magic_quotes_runtime),将会自动加上一个反斜杆(\),保护系统和数据库的安全。
ini_set('magic_quotes_runtime', 0);
define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc() ? true : false);
} else {
define('MAGIC_QUOTES_GPC', false);
}
define('IS_CGI', (0 === strpos(PHP_SAPI, 'cgi') || false !== strpos(PHP_SAPI, 'fcgi')) ? 1 : 0);
define('IS_WIN', strstr(PHP_OS, 'WIN') ? 1 : 0);
define('IS_CLI', PHP_SAPI == 'cli' ? 1 : 0);
if (!IS_CLI) {
// 当前文件名
if (!defined('_PHP_FILE_')) {
if (IS_CGI) {
//CGI/FASTCGI模式下
$_temp = explode('.php', $_SERVER['PHP_SELF']);
define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'], '', $_temp[0] . '.php'), '/'));
} else {
define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'], '/'));
}
}
if (!defined('__ROOT__')) {
$_root = rtrim(dirname(_PHP_FILE_), '/');
define('__ROOT__', (('/' == $_root || '\\' == $_root) ? '' : $_root));
}
}
// 加载核心Think类
require CORE_PATH . 'Think' . EXT;
// 应用初始化
Think\Think::start();
解析 :
get_magic_quotes_gpc()
返回值: 长整数
本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。当 magic_quotes_gpc 打开时,所有的 ' (单引号), " (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。
3.Think.class.php
// 注册AUTOLOAD方法
spl_autoload_register('Think\Think::autoload');
// 设定错误和异常处理
register_shutdown_function('Think\Think::fatalError');
set_error_handler('Think\Think::appError');
set_exception_handler('Think\Think::appException');
// 初始化文件存储方式
Storage::connect(STORAGE_TYPE);
// 如果有 $runtimefile 同时 开启 APP_DEBUG
if (!APP_DEBUG && Storage::has($runtimefile)) {
Storage::load($runtimefile);
}else{
// 读取应用模式
// 加载核心文件
// 加载应用模式配置文件
// 读取当前应用模式对应的配置文件
// 加载应用别名定义文件
// 加载模式行为定义
// 加载应用行为定义
// 加载框架底层语言包
}
// 读取当前应用状态对应的配置文件
// 设置系统时区
// 检查应用目录结构 如果不存在则自动创建
// 记录加载文件时间
// 运行应用
4. App.class.php
/**
* 运行应用实例 入口文件使用的快捷方法
* @access public
* @return void
*/
public static function run()
{
// 加载动态应用公共文件和配置
load_ext_file(COMMON_PATH);
// 应用初始化标签
Hook::listen('app_init');
App::init();
// 应用开始标签
Hook::listen('app_begin');
// Session初始化
if (!IS_CLI) {
session(C('SESSION_OPTIONS'));
}
// 记录应用初始化时间
G('initTime');
App::exec();
// 应用结束标签
Hook::listen('app_end');
return;
}
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方法
参考文档:https://www.cnblogs.com/gamir/p/4264930.html
https://www.cnblogs.com/Sunlight1992/p/4545174.html