當我們使用術語"類庫"時,我們一般指的是位于libraries 檔案夾中的類,它們在wiki的"類庫參考"這個闆塊被讨論.在目前這個話題中,我們将讨論如何在 application/libraries 檔案夾中建立你自己的類庫,并使它們與全架構的資源維持分離.
作為一個額外的功能,當你需要在原始類中簡單地添加一些功能時,CodeIgniter能使你的類庫extend 自原始類.你甚至可以通過在application/libraries檔案夾下安放同名類庫檔案的方法來完全替換原始類.
總之:
你可以建立全新的類庫.
你可以擴充原始類庫.
你可以替換原始類庫.
以下頁面将深入介紹這三個概念.
注意: 除了資料庫類無法被擴充或替換,剩餘其他類均可。
你的類庫檔案必須儲存在 application/libraries 檔案夾,CodeIgniter将在這個檔案夾中尋找并初始化它們.
檔案名首字母大寫. 例如: Myclass.php
類聲明首字母大寫. 例如: class Myclass
類的名字和檔案名應相同.
所有的類應有基礎原型(注意,這裡我們以 Someclass 這個名字為例):
<code><?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Someclass { public function some_function() { } } /* End of file Someclass.php */</code>
<code>$this->load->library('someclass');</code>
當 someclass 是檔案名時,不用加上".php"擴充名.這裡名字不分大小寫.
一旦你自定義的類加載完畢,你可以通過以下方式調用類,注意使用 小寫 的名字:
<code>$this->someclass->some_function(); // 對象的執行個體名永遠都是小寫的</code>
當初始化類庫時,你可以通過第二個參數動态的傳遞數組到類的構造函數中去:
<code>$params = array('type' => 'large', 'color' => 'red'); $this->load->library('Someclass', $params);</code>
當你使用這個特性時,你必須為類的構造函數加上參數:
<code><?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Someclass { public function __construct($params) { // Do something with $params } } ?></code>
你也可以傳遞存于配置檔案中的參數.你隻需簡單的建立一個與 類檔案名相同的config檔案,并儲存在 application/config/ 檔案夾中.注意當你通過上文所述的方式動态傳遞參數時,config檔案中的選項将不起作用.
要在你自定義的類庫中通路CodeIgniter的原始資源,你必須使用 get_instance() 函數.這個函數傳回一個CodeIgniter super object.
一般來說在你的控制器函數中你可以通過 $this 調用任何可用的CodeIgniter函數:
<code>$this->load->helper('url'); $this->load->library('session'); $this->config->item('base_url'); //etc.</code>
$this, 隻直接作用在你自己的控制器,模型和視圖中.當你在自定義類中想使用CodeIgniter原始類時,你可以這樣做:
首先,定義CodeIgniter對象賦給一個變量:
<code>$CI =& get_instance();</code>
一旦定義某個對象為一個變量,你就可以使用那個變量名 取代 $this:
<code>$CI =& get_instance(); $CI->load->helper('url'); $CI->load->library('session'); $CI->config->item('base_url'); //etc.</code>
注意: 你将注意到get_instance()這個函數通過被引用的方式被傳遞:
$CI =& get_instance();
這十分重要. 通過引用的方式賦給變量将使用原始的 CodeIgniter 對象,而不是建立一個副本。
簡單的将你自己的類命名為與原始類一樣就能使CodeIgniter使用這個新類.要使用這個特性,檔案名與類聲明必須與原始類完全一緻。例如,要替換原始的 Email 類庫。你必須建立一個檔案application/libraries/Email.php, 并按如下方式聲明類:
<code>class CI_Email { }</code>
注意大多數原始類以CI_為字首.
你可以隻用标準載入函數來載入你自己的類:
<code>$this->load->library('email');</code>
注意: 這個時候Database無法替換為你自定義的類.
如果你需要在現有類庫中加入一兩個新的功能,那就完全不必要替換整個類庫檔案.你隻需簡單地擴充(繼承)現有的類,擴充一個類就像在類中增加一些例外:
擴充的類必須申明由父類擴充而來.
新擴充的類所在的檔案必須以 MY_ 為字首(這個選項是可配置的,下面有說明).
例如,要擴充原始類 Email 類你要建立檔案 application/libraries/MY_Email.php, 并按如下方式在檔案中聲明:
<code>class MY_Email extends CI_Email { }</code>
注意:如果你需要在類中使用構造函數,你必須在構造函數中顯式繼承父類構造函數:
<code>class MY_Email extends CI_Email { public function __construct() { parent::__construct(); } }</code>
要載入擴充子類,你應該使用标準字元名. 請不要使用字首. 例如,要載入上文說過的email擴充子類,你應該這樣寫:
擴充子類一旦被載入,就能像一般的類一樣使用它們. Email類中的所有函數就能被調用:
<code>$this->email->some_function();</code>
要設定你自己的子類字首,請打開 application/config/config.php 檔案并找到這一項:
<code>$config['subclass_prefix'] = 'MY_';</code>
注意所有原始CodeIgniter類庫以 CI_ 作為字首,是以請勿以CI_作為你自己的字首.
如何聯系我:【萬裡虎】www.bravetiger.cn
【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/