說(shuō)好的應(yīng)用初始化
上回書(shū)說(shuō)到 ThinkPHP 框架入口文件公你,加載了框架Think.class.php
,并執(zhí)行了靜態(tài)方法start()
假瞬。那么在start()
這個(gè)靜態(tài)方法中陕靠,又做了哪些呢迂尝?
本回書(shū)繼續(xù)說(shuō)道說(shuō)道。
應(yīng)用初始化做什么剪芥?
如下步驟:
注冊(cè)AUTOLOAD方法
spl_autoload_register('Think\Think::autoload');
使用spl_autoload_register
注冊(cè)了Think\Think::autoload
這個(gè)靜態(tài)方法垄开,當(dāng)類不存在的時(shí)候調(diào)用這個(gè)方法,以自動(dòng)加載不存在的類税肪。
設(shè)定錯(cuò)誤和異常處理
register_shutdown_function('Think\Think::fatalError');
set_error_handler('Think\Think::appError');
set_exception_handler('Think\Think::appException');
當(dāng) PHP 終止執(zhí)行的時(shí)候溉躲,當(dāng) PHP 執(zhí)行錯(cuò)誤的時(shí)候,當(dāng) PHP 拋出異常的時(shí)候,一直這些函數(shù)設(shè)定的靜態(tài)方法益兄,來(lái)處理錯(cuò)誤與異常锻梳。
初始化文件存儲(chǔ)方式
Storage::connect(STORAGE_TYPE);
這里的STORAGE_TYPE
的值有兩種可能,分別是Sae
或者File
。
SAE 是新浪云平臺(tái)偏塞,由于不支持直接寫(xiě)入文件唱蒸,所以這里定義了 SAE 的模式邦鲫。
加載核心文件
加載什么核心文件呢灸叼?
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
吐槽一下這種寫(xiě)法,不直觀庆捺,我覺(jué)得應(yīng)該在寫(xiě)成
include()
,而不是include
古今。
如果/ThinkPHP/Think/core.php
不存在,那么加載/ThinkPHP/Model/common.php
滔以。
foreach ($mode['core'] as $file){
if(is_file($file)) {
include $file;
if(!APP_DEBUG)
$content .= compile($file);
}
}
這里的$file
都是寫(xiě)什么捉腥?我們來(lái)看看/ThinkPHP/Modle/common.php
。
'core' => array(
THINK_PATH.'Common/functions.php',
COMMON_PATH.'Common/function.php',
CORE_PATH . 'Hook'.EXT,
CORE_PATH . 'App'.EXT,
CORE_PATH . 'Dispatcher'.EXT,
//CORE_PATH . 'Log'.EXT,
CORE_PATH . 'Route'.EXT,
CORE_PATH . 'Controller'.EXT,
CORE_PATH . 'View'.EXT,
BEHAVIOR_PATH . 'BuildLiteBehavior'.EXT,
BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT,
BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT,
),
引入了function
文件你画,終于可以使用dump()
函數(shù)了抵碟,真高興。之后的代碼中可以看到例如C()
這樣的單字母大寫(xiě)函數(shù)了坏匪。
終于看到Route
拟逮、Controller
以及View
這些單詞了,距離 MVC 還遠(yuǎn)嗎适滓?
加載核心的配置文件:
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(load_config($file)):C($key,load_config($file));
}
哪些核心的配置文件:
'config' => array(
THINK_PATH.'Conf/convention.php', // 系統(tǒng)慣例配置
CONF_PATH.'config'.CONF_EXT, // 應(yīng)用公共配置
),
然后需要加載用戶的配置文件:
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(load_config($file)):C($key,load_config($file));
}
加載模式別名定義
加載應(yīng)用別名定義文件
加載模式行為定義
加載應(yīng)用行為定義
加載框架底層語(yǔ)言包
讀取當(dāng)前應(yīng)用狀態(tài)對(duì)應(yīng)的配置文件
設(shè)置系統(tǒng)時(shí)區(qū)
date_default_timezone_set(C('DEFAULT_TIMEZONE'));
設(shè)定用于一個(gè)腳本中所有日期時(shí)間函數(shù)的默認(rèn)時(shí)區(qū)敦迄。
檢查應(yīng)用目錄結(jié)構(gòu)
檢查目錄的結(jié)構(gòu),如果不存在凭迹,則創(chuàng)建罚屋。
if(C('CHECK_APP_DIR')) {
$module = defined('BIND_MODULE') ? BIND_MODULE : C('DEFAULT_MODULE');
if(!is_dir(APP_PATH.$module) || !is_dir(LOG_PATH)){
// 檢測(cè)應(yīng)用目錄結(jié)構(gòu)
Build::checkDir($module);
}
}
記錄加載文件時(shí)間
G('loadTime');
運(yùn)行應(yīng)用
App::run();