創(chuàng)建類庫
當(dāng)我們使用術(shù)語"類庫"時,我們一般指的是位于libraries 文件夾中的類,它們在wiki的"類庫參考"這個板塊被討論.在當(dāng)前這個話題中,我們將討論如何在 application/libraries 文件夾中建立你自己的類庫,并使它們與全框架的資源維持分離.
作為一個額外的功能,當(dāng)你需要在原始類中簡單地添加一些功能時,CodeIgniter能使你的類庫extend 自原始類.你甚至可以通過在application/libraries文件夾下安放同名類庫文件的方法來完全替換原始類.
總之:
- 你可以創(chuàng)建全新的類庫.
- 你可以擴展原始類庫.
- 你可以替換原始類庫.
以下頁面將深入介紹這三個概念.
注意: 除了數(shù)據(jù)庫類無法被擴展或替換,剩余其他類均可。
建立你的類庫文件
你的類庫文件必須保存在 application/libraries 文件夾,CodeIgniter將在這個文件夾中尋找并初始化它們.
命名約定
- 文件名首字母大寫. 例如:? Myclass.php
- 類聲明首字母大寫. 例如:? class Myclass
- 類的名字和文件名應(yīng)符合.
類文件
所有的類應(yīng)有基礎(chǔ)原型(注意,這里我們以 Someclass 這個名字為例):
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
????public function some_function()
????{
????}
}
使用你自己的類
在所有的Controller 函數(shù)中,你可以用以下的標準方式初始化你的類:
$this->load->library('someclass');
當(dāng) someclass 是文件名時,不用加上".php"擴展名.這里名字不分大小寫.
一旦你自定義的類加載完畢,你可以通過以下方式調(diào)用類,注意使用 小寫 的名字:
$this->someclass->some_function();? // 對象的實例名永遠都是小寫的
在初始化自定義類時傳遞參數(shù)
當(dāng)初始化類庫時,你可以通過第二個參數(shù)動態(tài)的傳遞數(shù)組到類的構(gòu)造函數(shù)中去:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);
當(dāng)你使用這個特性時,你必須為類的構(gòu)造函數(shù)加上參數(shù):
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
????public function __construct($params)
????{
????????// Do something with $params
????}
}
?>
你也可以傳遞存于配置文件中的參數(shù).你只需簡單的建立一個與 類文件名相同的config文件,并保存在 application/config/ 文件夾中.注意當(dāng)你通過上文所述的方式動態(tài)傳遞參數(shù)時,config文件中的選項將不起作用.
在你自定義的類庫中初始化CodeIgniter資源
要你自定義的類庫中訪問CodeIgniter的原始資源,你必須使用 get_instance() 函數(shù).這個函數(shù)返回一個CodeIgniter super object.
一般來說在你的控制器函數(shù)中你可以通過 $this 調(diào)用任何可用的CodeIgniter函數(shù):
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
//etc.
$this, 只直接作用在你自己的控制器,模型和視圖中.當(dāng)你在自定義類中想使用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()這個函數(shù)通過被引用的方式被傳遞:
$CI =& get_instance();
這十分重要. 通過引用的方式賦給變量將使用原始的 CodeIgniter 對象,而不是創(chuàng)建一個副本。
用你自己的類替換原始類
簡單的將你自己的類命名為與原始類一樣就能使CodeIgniter使用這個新類.要使用這個特性,文件名與類聲明必須與原始類完全一致。例如,要替換原始的 Email 類庫。你必須創(chuàng)建一個文件application/libraries/Email.php, 并按如下方式聲明類:
class CI_Email {
}
注意大多數(shù)原始類以CI_為前綴.
你可以只用標準載入函數(shù)來載入你自己的類:
$this->load->library('email');
注意: 這個時候Database無法替換為你自定義的類.
擴展現(xiàn)有類
如果你需要在現(xiàn)有類庫中加入一兩個新的功能,那就完全不必要替換整個類庫文件.你只需簡單地擴展(繼承)現(xiàn)有的類,擴展一個類就像在類中增加一些例外:
- 擴展的類必須申明由母類擴展而來.
- 新擴展的類所在的文件必須以 MY_ 為前綴(這個選項是可配置的,下面有說明).
例如,要擴展原始類 Email 類你要建立文件 application/libraries/MY_Email.php, 并按如下方式在文件中聲明:
class MY_Email extends CI_Email {
}
注意:如果你需要在類中使用構(gòu)造函數(shù),你必須在構(gòu)造函數(shù)中顯式繼承母類構(gòu)造函數(shù):
class MY_Email extends CI_Email {
????public function __construct()
????{
????????parent::__construct();
????}
}
載入你的子類
要載入擴展子類,你應(yīng)該使用標準字符名. 請不要使用前綴. 例如,要載入上文說過的email擴展子類,你應(yīng)該這樣寫:
$this->load->library('email');
擴展子類一旦被載入,就能像一般的類一樣使用它們. Email類中的所有函數(shù)就能被調(diào)用:
$this->email->some_function();
設(shè)定自定義前綴
要設(shè)定你自己的子類前綴,請打開 application/config/config.php 文件并找到這一項:
$config['subclass_prefix'] = 'MY_';
注意所有原始CodeIgniter類庫以 CI_ 作為前綴,所以請勿以CI_作為你自己的前綴.
?