**CI中建立你自己的類庫

suboysugar發表於2015-03-15

http://codeigniter.org.cn/user_guide/general/creating_libraries.html

建立類庫

當我們使用術語”類庫”時,我們一般指的是位於libraries 資料夾中的類,它們在wiki的”類庫參考”這個板塊被討論.在當前這個話題中,我們將討論如何在 application/libraries 資料夾中建立你自己的類庫,並使它們與全框架的資源維持分離.

作為一個額外的功能,當你需要在原始類中簡單地新增一些功能時,CodeIgniter能使你的類庫extend 自原始類.你甚至可以通過在application/libraries資料夾下安放同名類庫檔案的方法來完全替換原始類.

總之:

  • 你可以建立全新的類庫.
  • 你可以擴充套件原始類庫.
  • 你可以替換原始類庫.

以下頁面將深入介紹這三個概念.

注意: 除了資料庫類無法被擴充套件或替換,剩餘其他類均可。

建立你的類庫檔案

你的類庫檔案必須儲存在 application/libraries 資料夾,CodeIgniter將在這個資料夾中尋找並初始化它們.

命名約定

  • 檔名首字母大寫. 例如:  Myclass.php
  • 類宣告首字母大寫. 例如:  class Myclass
  • 類的名字和檔名應相同.

類檔案

所有的類應有基礎原型(注意,這裡我們以 Someclass 這個名字為例):

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

class Someclass {

    public function some_function()
    {
    }
}

/* End of file Someclass.php */

使用你自己的類

在所有的Controller 函式中,你可以用以下的標準方式初始化你的類:

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

當 someclass 是檔名時,不用加上”.php”副檔名.這裡名字不分大小寫.

一旦你自定義的類載入完畢,你可以通過以下方式呼叫類,注意使用 小寫 的名字:

$this->someclass->some_function();  // 物件的例項名永遠都是小寫的

在初始化自定義類時傳遞引數

當初始化類庫時,你可以通過第二個引數動態的傳遞陣列到類的建構函式中去:

$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
    }
}

?>

你也可以傳遞存於配置檔案中的引數.你只需簡單的建立一個與 類檔名相同的config檔案,並儲存在 application/config/ 資料夾中.注意當你通過上文所述的方式動態傳遞引數時,config檔案中的選項將不起作用.

在你自定義的類庫中初始化CodeIgniter資源

要在你自定義的類庫中訪問CodeIgniter的原始資源,你必須使用 get_instance() 函式.這個函式返回一個CodeIgniter super object.

一般來說在你的控制器函式中你可以通過 $this 呼叫任何可用的CodeIgniter函式:

$this->load->helper(`url`);
$this->load->library(`session`);
$this->config->item(`base_url`);
//etc.

$this, 只直接作用在你自己的控制器,模型和檢視中.當你在自定義類中想使用CodeIgniter原始類時,你可以這樣做:

首先,定義CodeIgniter物件賦給一個變數:

$CI =& get_instance();

一旦定義某個物件為一個變數,你就可以使用那個變數名 取代 $this:

$CI =& get_instance();

$CI->load->helper(`url`);
$CI->load->library(`session`);
$CI->config->item(`base_url`);
//etc.

注意: 你將注意到get_instance()這個函式通過被引用的方式被傳遞:

$CI =& get_instance(); 

這十分重要. 通過引用的方式賦給變數將使用原始的 CodeIgniter 物件,而不是建立一個副本。

用你自己的類替換原始類

簡單的將你自己的類命名為與原始類一樣就能使CodeIgniter使用這個新類.要使用這個特性,檔名與類宣告必須與原始類完全一致。例如,要替換原始的 Email 類庫。你必須建立一個檔案application/libraries/Email.php, 並按如下方式宣告類:

class CI_Email {

}

注意大多數原始類以CI_為字首.

你可以只用標準載入函式來載入你自己的類:

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

注意: 這個時候Database無法替換為你自定義的類.

擴充套件現有類

如果你需要在現有類庫中加入一兩個新的功能,那就完全不必要替換整個類庫檔案.你只需簡單地擴充套件(繼承)現有的類,擴充套件一個類就像在類中增加一些例外:

  • 擴充套件的類必須申明由父類擴充套件而來.
  • 新擴充套件的類所在的檔案必須以 MY_ 為字首(這個選項是可配置的,下面有說明).

例如,要擴充套件原始類 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();

設定自定義字首

要設定你自己的子類字首,請開啟 application/config/config.php 檔案並找到這一項:

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

注意所有原始CodeIgniter類庫以 CI_ 作為字首,所以請勿以CI_作為你自己的字首.

如何聯絡我:【萬里虎】www.bravetiger.cn
【QQ】3396726884 (諮詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/


相關文章