驅動器是一種特殊類型的類庫,它有一個父類和任意多個子類。子類能夠訪問父類, 但不能訪問兄弟類。在你的控制器中,驅動器爲你的類庫提供了 一種優雅的語法,從而不用將它們拆成不少離散的類。php
通常咱們看到父類和子類,咱們會堅決果斷的認爲他們是繼承和派生的關係,可是這裏須要注意的是,驅動器中所提到的子類,並非真的繼承了父類驅動器,僅僅是其有訪問父類驅動器的權限,在其中一篇參考文獻中,做者將父類稱爲主類(master class),將此類稱爲次類(sub class),我的認爲這種叫法比官方的更爲精確,因此後面借用這一稱謂。關於這個注意事項在後面的例子裏讀者能夠看到。html
驅動器位於 system/libraries/ 目錄,每一個驅動器都有一個獨立的目錄,目錄名和 驅動器父類的類名一致,在該目錄下還有一個子目錄,命名爲 drivers,用於存放全部子類的文件。數組
要使用一個驅動器,你能夠在控制器中使用下面的方法來進行初始化:網絡
$this->load->driver(‘class_name‘);app
class_name 是你想要調用的驅動器類名,例如,你要加載名爲 Some_parent 的驅動器, 能夠這樣:框架
$this->load->driver(‘some_parent‘);ide
而後就能夠像下面這樣調用該類的方法:函數
$this->some_parent->some_method();codeigniter
而對於那些子類,咱們不用初始化,能夠直接經過父類調用了:佈局
$this->some_parent->child_one->some_method();
$this->some_parent->child_two->another_method();
舉一個實際的例子,假如咱們須要建立一個Connect類來鏈接各類社交服務,而且從這些平臺獲取一些數據。直接借用外國網友的例子。
實際的代碼看起來是這樣的:
$this‘connect‘->load->driver();
$this->connect->facebook->get_friends();
$this->connect->twitter->get_twitts();
這樣就把一些分散的功能集中到一個類庫中了,並且結構很是清晰。
CI的官方文檔中並無詳細介紹如何本身寫一個驅動器,所以這裏是重點。建立驅動器的第一步是建立一個驅動器文件目錄結構, 這裏咱們建立本身的驅動器,要放在application/libraries目錄下。文件夾名和驅動器類名相同,而且首字母大寫如Connect,在此文件夾中再建立一個子文件夾,必定要取名爲drivers,注意這裏文件夾名稱是小寫字母,在drivers文件內建立次驅動器文件,文件名以主驅動器類名加下劃線開頭。
驅動器目錄和文件結構佈局以下圖所示:
建立主驅動器類
application/libraries/Connect/Connect.php
<?php
if‘BASEPATH‘ (!defined())
exit‘No direct script access allowed‘ ();
classConnectextendsCI_Driver_Library
{
public$valid_drivers ;
public$CI ;
function__construct()
{
$this ->CI = &get_instance();
$this‘connect‘TRUE ->CI->config->load(, );
$this$this‘modules‘‘connect‘ ->valid_drivers = ->CI->config->item(, );
}
publicfunctionget_friends()
{
return$this$this ->twitter->get_friends() . ->facebook->get_friends();
}
}
讀者應該注意到了主驅動器類繼承的是CI_Driver_Library,變量$valid_drivers是必須的,它是用來告訴框架應該加載哪些次驅動器,它是一個包含次驅動器類名稱的數組。有兩種方法來定義這個變量:
第一種方法是直接在驅動器代碼中定義:
將下面的代碼替換構造函數的最後一句
$this->Valid_drivers= array(‘connect_twitter‘, ‘connect_facebook‘);
第二種方法是經過配置文件:
推薦採用這種方法,維護起來比較方便。建立一個文件application/config/connect.php
<?php
$config‘modules‘array‘connect_twitter‘‘connect_facebook‘[] = (, );
這個字段取名爲modules,你能夠本身取一個名稱,而後正如上面那個例子那樣來調用。
在例子中咱們還用$CI變量引用了框架的超級對象,而後加載配置文件,參數TRUE是爲了防止名稱與框架衝突,主驅動器類中的public和protected變量和方法在次驅動器中都是能夠訪問的。
建立次驅動器類
application/libraries/Connect/drivers/Connect_twitter.php
<?php
if‘BASEPATH‘ (!defined())
exit‘No direct script access allowed‘ ();
classConnect_twitterextendsCI_Driver
{
publicfunctionget_twitts()
{
return‘Мои последние твитты:‘ ;
}
publicfunctionget_friends()
{
return‘@vanya, @stepa ‘ ;
}
}
application/libraries/Connect/drivers/Connect_facebook.php
<?php
if‘BASEPATH‘ (!defined())
exit‘No direct script access allowed‘ ();
classConnect_facebookextendsCI_Driver
{
publicfunctionget_friends()
{
return‘Ivan, Stepan ‘ ;
}
}
這裏咱們注意到次驅動器並非繼承主驅動器,也沒有繼承CI_Driver_Library而是CI_Driver。
因爲全部次驅動器有方法主驅動器的權限,次驅動器僅能經過主驅動器訪問,所以次驅動器之間的數據交換要經過主驅動器做爲中間橋樑。
. application/controller/home.php
<?phpif‘BASEPATH‘exit‘No direct script access allowed‘ ( ! defined()) ();
class Home extends CI_Controller {
publicfunction__construct()
{
parent ::__construct();
$this‘connect‘ ->load->driver();
}
public function friends()
{
echo‘我社交網絡的朋友: ‘ ;
echo$this ->connect->get_friends();
//同時從兩個站點得到
}
public function twitts()
{
echo$this ->connect->twitter->get_twitts();
// Twitter記錄
}
}