首先:入口文件
// 檢測PHP環境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
// 開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false
define('APP_DEBUG',True);
// 定義應用目錄
define('APP_PATH','./Application/');
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
// 親^_^ 後面不需要任何代碼了 就是如此簡單
以上代碼,看過tp的人應該是非常熟悉的,這段代碼直接進入系統目錄(ThinkPHP/)下的ThinkPHP.php中
ThinkPHP.php文件裏面主要做了一些常量的定義,你可以先不了太過仔細看每個常量是什麼意思,因爲看了,過一會也會忘記的。你只要記住,這個文件定義了系統的大多數的常量就好了,把更多的精力放在後面的類的解讀中。
ThinkPHP.php定義完相關的常量以後,會加載核心Think類
//......
// 加載核心Think類
require CORE_PATH.'Think'.EXT;
// 應用初始化
Think\Think::start();
看到這裏,我們就打開Think.class.php文件
文件主要講的是大致流程,一些無關流程的方法就不介紹了
所以Think.class.php文件,主要熟悉+精通 start()方法
/**
* 應用程序初始化
* @access public
* @return void
*/
static public function start() {
// 註冊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 = RUNTIME_PATH.APP_MODE.'~runtime.php';
//APP_DEBUG爲調試模式配置,APP_DEBUG = TRUE的時候是開啓調試模式的
if(!APP_DEBUG && Storage::has($runtimefile)){
//如果沒有開啓調試模式並且緩存文件存在,系統並會加載緩存文件
Storage::load($runtimefile);
}else{
if(Storage::has($runtimefile))
Storage::unlink($runtimefile);
$content = '';
// 讀取應用模式,如果應用下面自定了core.php文件,直接加載之;否則讀取系統目錄下的Mode文件夾下的模式應用文件
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
// 加載核心文件
foreach ($mode['core'] as $file){
if(is_file($file)) {
include $file;
if(!APP_DEBUG) $content .= compile($file);
}
}
// 加載應用模式配置文件
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(load_config($file)):C($key,load_config($file));
}
// 讀取當前應用模式對應的配置文件
if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.CONF_EXT))
C(load_config(CONF_PATH.'config_'.APP_MODE.CONF_EXT));
// 加載模式別名定義
if(isset($mode['alias'])){
self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']);
}
// 加載應用別名定義文件
if(is_file(CONF_PATH.'alias.php'))
self::addMap(include CONF_PATH.'alias.php');
// 加載模式行爲定義
if(isset($mode['tags'])) {
Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}
// 加載應用行爲定義
if(is_file(CONF_PATH.'tags.php'))
// 允許應用增加開發模式配置定義
Hook::import(include CONF_PATH.'tags.php');
// 加載框架底層語言包
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
if(!APP_DEBUG){
$content .= "\nnamespace { Think\Think::addMap(".var_export(self::$_map,true).");";
$content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(Hook::get(),true).');}';
Storage::put($runtimefile,strip_whitespace('<?php '.$content));
}else{
// 調試模式加載系統默認的配置文件
C(include THINK_PATH.'Conf/debug.php');
// 讀取應用調試配置文件
if(is_file(CONF_PATH.'debug'.CONF_EXT))
C(include CONF_PATH.'debug'.CONF_EXT);
}
}
// 讀取當前應用狀態對應的配置文件
if(APP_STATUS && is_file(CONF_PATH.APP_STATUS.CONF_EXT))
C(include CONF_PATH.APP_STATUS.CONF_EXT);
// 設置系統時區
date_default_timezone_set(C('DEFAULT_TIMEZONE'));
// 檢查應用目錄結構 如果不存在則自動創建
if(C('CHECK_APP_DIR')) {
$module = defined('BIND_MODULE') ? BIND_MODULE : C('DEFAULT_MODULE');
if(!is_dir(APP_PATH.$module) || !is_dir(LOG_PATH)){
// 檢測應用目錄結構
Build::checkDir($module);
}
}
// 記錄加載文件時間
G('loadTime');
<pre name="code" class="php"> // 運行應用
App::run();
}
這個方法主要做的是:
自動加載
異常,錯誤處理方法
核心文件加載
語言包加載
別名加載
配置文件加載
行爲加載
...
程序走到這裏,應用程序準備階段告一段落,最後調用
// 運行應用
App::run();
應用準備工作完畢,自然是運行這個應用,程序進入App.class.php 這個類文件主要圍繞一個方法進行:App::run();
/**
* 運行應用實例 入口文件使用的快捷方法
* @access public
* @return void
*/
static public function run() {
App::init();
// Session初始化
if(!IS_CLI){
session(C('SESSION_OPTIONS'));
}
// 記錄應用初始化時間
G('initTime');
App::exec();
return ;
}
這個方法調用App::init();
在App::init()主要是對URL的解析和請求常量的定義
最後調用App::exec()方法,程序走到這裏,就差不多走完了
App::exec()方法調用控制器(Controller)的方法,調用方法用到了類反射,最後就是控制器調用視圖顯示頁面。
畢~
差不多了,學習總結,如有錯誤,請留言告知,筆者將不勝感激