CodeIgniter 使用手冊版本 2.1.4


建立自己的程式庫

當我們使用"程式庫(Libraries)"這個名稱的時候, 我們通常指的是位在 libraries 目錄底下的類別, 詳細可參考使用手冊中的類別參考的說明。 而在這邊,我們要教你的是如何在 application/libraries 建立你自己的程式庫。這是為了將你的程式庫與CodeIgniter內建的區分開來。

CodeIgniter允許你繼承(extend)原有的類別以擴充新功能。你也可以直接取代掉原本的類別,只要你使用與原有類別相同的名稱並放進 application/libraries 資料夾裡即可。

總結歸納:

底下詳細解釋這三個概念。

注意: 只有資料庫相關的類別無法被繼承,也無法用你自己的版本取代。其他的類別都可以。

存檔位置

自己建立的類別函數可以存放在 application/libraries 資料夾, 當 CodeIgniter 必須初始化建立類別函數, 系統就會來此資料夾查詢並且載入.

命名規則

類別檔

類別檔應該有底下的基本型態。(注意: 底下取名 Someclass 單純只是舉例而已:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    public function some_function()
    {
    }
}

/* End of file Someclass.php */

使用自建類別(Using Your Class)

控制器(Controller) 內的函數載入任何類別, 可使用下列的標準語法:

$this->load->library('someclass');

someclass 的部份, 只是該類別檔案名稱, 不需要包含 ".php" 副檔名。你可以使用大寫或是小寫的檔案名稱, CodeIgniter 都可以接受。

一但載入之後, 你可以取用你的類別採用 小寫 的方式:

$this->someclass->some_function();  // 物件方法名稱必須是小寫

於初使化自定類別時傳遞參數

在初始化類別時, 您可以透過傳遞第二個陣列參數來設定初始建構子:/p> $params = array('type' => 'large', 'color' => 'red');

$this->load->library('Someclass', $params);

當你使用這個特性時, 你必須為類別的建構子加上底下程式碼

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

    public function __construct($params)
    {
        // Do something with $params
    }
}

?>

你也可以使用設定檔來存放設定值,只要在 application/config/ 資料夾裡,建立一個與類別 小寫檔案名稱 相同的檔案即可。 但若是你使用上面所述的方式,由參數來傳入設定值,則設定檔就不會被使用。

在您的程式裡面使用 CodeIgniter 資源

使用函式 get_instance() 可以讓你在自己的程式庫中取得 CodeIgniter 的資源,這個函式將傳回 CodeIgniter 的 super object。

通常你可以在你的 controller 函式裡直接使用 $this 來呼叫 CodeIgniter 的函式:

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
// 以此類推

然而,這僅在 controllers, models 或是 views 能夠使用。若是你想在你自己製作的類別中使用 CodeIgniter 的類別,你可以這樣做:

首先,取得 CodeIgniter 物件並存放到變數中:

$CI =& get_instance();

當你將物件放到變數中,你就可以使用這個變數來取代 $this

$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
// 以此類推

注意: 你會發現範例中 get_instance() 時使用了 & 以取得物件的參考:

$CI =& get_instance();

這非常非常重要!! 取得物件的參考可以讓你使用同一個 CodeIgniter 物件,而不是複製一個副本。

使用個人版本替換原生程式庫

只要讓你的類別檔案使用與原生程式庫相同的檔案名稱,CodeIgniter 就會自動用它來代替原本的函式庫。 要這麼做,你必須讓檔案名稱與類別名稱都與要替換的原生程式庫完全相同才行。 例如,要取代掉原本的 Email 程式庫,你必須在 application/libraries/Email.php 建立一個檔案,並宣告你的類別為:

class CI_Email {

}

注意,大多數的原生類別名稱都使用 CI_ 做為前置字串。

這時只需要用標準的方式,就可以讀取你的版本:

$this->load->library('email');

注意: 目前還無法使用你自己的類別來替換掉資料庫的類別。

繼承原生程式庫(Extending Native Libraries)

如果你想要做的只是增加一些(可能一或兩個)函式給原有的程式庫,那就沒有必要將整個類別替換掉。這個時候使用繼承來擴充類別是更容易的方法。 要繼承一個類別的作法,有點類似將其替換掉,但有以下的差別:

例如,繼承原生的 Email 類別,你必須建立一個檔案 application/libraries/MY_Email.php, 並這樣宣告你的類別:

class MY_Email extends CI_Email {

}

注意: 如果你需要在你的類別中使用建構子,那你也必須執行父類別的建構子:

class MY_Email extends CI_Email {

    public function __construct()
    {
        parent::__construct();
    }
}

載入子類別

要讀取你的子類別,使用標準的語法載入即可。注意不要包含前置字串,例如你要讀取上面範例中 Email 的子類別,你可以這樣做:

$this->load->library('email');

載入成功後,你就可以像平常使用原生類別那樣使用這個子類別。在本例中,你可以這樣使用 email 類別:

$this->email->some_function();

自訂子類別的前置字串

要設定自己的子類別前置字串(sub-class prefix), 請開啟 application/config/config.php 然後找到底下的部份:

$config['subclass_prefix'] = 'MY_';

所有原生的 CodeIgniter 程式庫, 都是使用 CI_ 的前置字串, 所以別把它拿來用了。