? ? ? ?有人說(shuō)phper的深入要從研讀mvc框架開(kāi)始汗盘,我跳了一個(gè)常用的CI框架入手,一是因?yàn)?CI框架簡(jiǎn)單輕巧询一,二是原來(lái)用的最多的就是CI框架了隐孽。?
1、首先來(lái)看CI的整體架構(gòu)圖:
上圖中是我最新下載CI3.0版本健蕊,application是用戶級(jí)開(kāi)發(fā)目錄菱阵,我們關(guān)心system系統(tǒng)源碼目錄,CI的核心代碼都在這里了缩功。
1晴及、core 系統(tǒng)核心代碼
2、database數(shù)據(jù)庫(kù)相關(guān)的操作和幫助類(lèi)
3嫡锌、helers 系統(tǒng)提供的一些工具類(lèi)
4虑稼、language 語(yǔ)言包
5琳钉、libraries 系統(tǒng)依賴類(lèi)
2、CI的代碼流程
我們初次訪問(wèn)CI的時(shí)候進(jìn)入的welcome頁(yè)面蛛倦,那么這個(gè)welcome的頁(yè)面請(qǐng)求都經(jīng)過(guò)了哪些地方呢歌懒,我們來(lái)追蹤一下。
所以對(duì)ci的請(qǐng)求溯壶,都是首先進(jìn)入index.php文件及皂。在index.php文件中進(jìn)行CI框架的初始化操作,
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
define('BASEPATH', $system_path);
define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('SYSDIR', basename(BASEPATH));
define('APPPATH', $application_folder.DIRECTORY_SEPARATOR);
define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR);
require_once BASEPATH.'core/CodeIgniter.php';
在index.php文件中定義了必要的全局變量且改,最后引入了core/CodeIgniter.php核心類(lèi)验烧。那我們追蹤到core/CodeIgniter.php中,文件中首先引入了:
require_once(APPPATH.'config/constants.php');
require_once(BASEPATH.'core/Common.php');
之后又實(shí)例化了 Benchmark又跛、Hooks碍拆、Config、Log效扫、Utf8倔监、URI、Router菌仁、Output浩习、Security、Input济丘、Lang 類(lèi)谱秽,引入是調(diào)用common.php中的load_class方法實(shí)現(xiàn)的。
$class = ucfirst($RTR->class);
$method = $RTR->method;
在路由中提取出對(duì)應(yīng)要調(diào)用的class和method摹迷,然后實(shí)例化class且調(diào)用方法:
$CI = new $class();
call_user_func_array(array(&$CI, $method), $params);
其前后調(diào)用了四個(gè)鉤子:
$EXT->call_hook('pre_controller');
$EXT->call_hook('post_controller_constructor');
$EXT->call_hook('post_controller');
$EXT->call_hook('post_system');
這里解析出的class和method疟赊,其實(shí)就是Welcome和index,之后我們 進(jìn)入application/controllers/Welcome.php類(lèi)后發(fā)現(xiàn)峡碉,類(lèi)里只有
public function index(){
? ?$this->load->view('welcome_message');
}
簡(jiǎn)單的 加載模板方法近哟,我們看到Welcome 類(lèi)繼承自父類(lèi):CI_Controller
我們進(jìn)入CI_Controller類(lèi)中查看:
public function __construct(){
self::$instance =& $this;
foreach (is_loaded() as $var => $class){
$this->$var =& load_class($class);
}$this->load =& load_class('Loader', 'core');
$this->load->initialize();
log_message('info', 'Controller Class Initialized');
}
這段構(gòu)造函數(shù)是將,在引導(dǎo)類(lèi)CodeIgniter.php被實(shí)例化化的類(lèi)賦值到本地類(lèi)變量中鲫寄,以構(gòu)造一個(gè)超級(jí)對(duì)象被使用吉执。同時(shí)實(shí)現(xiàn)了一個(gè)單例 公外部調(diào)用。
那是如何賦值的那地来,這里調(diào)用了 common類(lèi) 中的is_loader()方法戳玫。其實(shí)就是返回的我們?cè)谏厦?/p>
調(diào)用load_class()加載過(guò)的類(lèi):
最后初始化成功后,會(huì)執(zhí)行CodeIgniter.php文件中的:
call_user_func_array(array(&$CI, $method), $params);
這個(gè)函數(shù)未斑,從而進(jìn)入我們welcome控制器的index方法咕宿。