CI框架源碼研讀(整體架構)


有人說phper的深入要從研讀mvc框架開始,我跳了一個常用的CI框架入手,主要是因為 CI框架簡單輕巧,可以自己DIY功能!!!

1、首先來看CI的整體架構圖:

其中:application是用戶級開發目錄,我們關心system系統源碼目錄,CI的核心代碼都在這里了。

1、core 系統核心代碼

2、database數據庫相關的操作和幫助類

3、helpers 系統提供的一些工具類

4、language 語言包

5、libraries 系統依賴類

2、CI的代碼流程

我們初次訪問CI的時候進入的welcome頁面,那么這個welcome的頁面請求都經過了哪些地方呢,我們來追蹤一下。

所以對ci的請求,都是首先進入index.php文件。在index.php文件中進行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核心類。那我們追蹤到core/CodeIgniter.php中,文件中首先引入了:

require_once(APPPATH.'config/constants.php');

require_once(BASEPATH.'core/Common.php');

之后又實例化了 Benchmark、Hooks、Config、Log、Utf8、URI、Router、Output、Security、Input、Lang 類,引入是調用common.php中的load_class方法實現的。

$class = ucfirst($RTR->class);

$method = $RTR->method;

在路由中提取出對應要調用的class和method,然后實例化class且調用方法:

$CI = new $class();

call_user_func_array(array(&$CI, $method), $params);

其前后調用了四個鈎子:

$EXT->call_hook('pre_controller');

$EXT->call_hook('post_controller_constructor');

$EXT->call_hook('post_controller');

$EXT->call_hook('post_system');

這里解析出的class和method,其實就是Welcome和index,之后我們 進入application/controllers/Welcome.php類后發現,類里只有

public function index(){

   $this->load->view('welcome_message');

}

簡單的 加載模板方法,我們看到Welcome 類繼承自父類:CI_Controller

我們進入CI_Controller類中查看:

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');

}

這段構造函數是將,在引導類CodeIgniter.php被實例化化的類賦值到本地類變量中,以構造一個超級對象被使用。同時實現了一個單例 公外部調用。

那是如何賦值的那,這里調用了 common類 中的is_loader()方法。其實就是返回的我們在上面

調用load_class()加載過的類:

最后初始化成功后,會執行CodeIgniter.php文件中的:

call_user_func_array(array(&$CI, $method), $params);

這個函數,從而進入我們welcome控制器的index方法。

大致的流程就是如此,可以根據自己的想法去實現功能,開發有意思的功能模塊!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM