使用CodeIgniter框架快速開發PHP應用(一)

傑克.陳發表於2015-01-28
原文:使用 CodeIgniter 框架快速開發 PHP 應用(一)

對 CodeIgniter 的介紹

大多數PHPer都想寫出執行狀態良好的應用程式,而且希望儘可能做得簡單且不費事。這篇文章是有關 CodeIgniter的(以後簡稱CI),CI是一個達成上面目的的所謂框架。

如果你只是要達成一個最終的結果,而把中間所有的編碼細節和複雜統統丟給一個框架,CI是你最好的朋友。

CI有很多優點:免費, 輕量級, 容易安裝, 它能使你的程式設計生涯變得很輕鬆。 這一章我們會告訴你:

. CI 能為你做什麼?

. 什麼是“框架” ?CI 為什麼能被稱為框架?

. “開源”商業模式

. CI的某些不足(是的, 它不完美)


CodeIgniter 能為你做什麼?

如果你已經是一位PHPer, 開發過PHP應用, CodeIgniter 將會幫助你做得更好, 更容易達成目標。 CI會減少你的程式碼數量。你的指令碼可讀性也會更好,更容易升級。它會使你的網站結構更緊湊,程式碼更強健, 如果不是很好地研究CI的原始碼的話,你可能還無法察覺到它的強健。

對大多數兄弟來講,你可能已經花了不少時間, 系統地學習了PHP、HTML和CSS,當然還有MySQL什麼的。不過如果使用CI,你只需要一些基本的LAMP(WAMP)知識, 你沒有必要先成為一個專家才能使用CI。 你完全可以先借助於CI或別的什麼框架軟體,成為一個有生產力的PHP程式設計師,拿著高薪然後優雅地進一步學習PHP的中高階知識,直至成為一位真正的PHP骨灰級人物。

下述情形,你最好不要使用CI:

. 你沒有一點PHP和HTML的基本知識.

. 四五個頁面的小程式.

. 只用極少的程式碼就要完成一個CMS或FORUM程式(CI做不到,神仙也做不到)

節約時間

CI學習週期短,見效快。 讓我們試著評估一下相關的要素:

CI如何減少程式碼數量?

你真的可以減少很多工作量:敲擊鍵盤的次數減少了, 程式碼錯誤減少了, 你只需要較少的時間除錯程式碼。 程式碼量減少還意味著你只需要較少的空間來存放應用程式。

舉二個例子(稍後它們會被進一步分析, 因此不用擔心如何瞭解它們的工作原理!)

想像你正在寫一個MySQL資料庫查詢。 可能的程式碼如下:

PHP
   $connection = mysql_connect(“localhost”,“fred”,“12345”);
   mysql_select_db(“websites”, $connection);
   $result = mysql_query(“SELECT * FROM sites”, $connection);
   while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
      foreach ($row as $attribute) {
         print {$attribute[1]} “;
      }
   }

複製程式碼



現在看看CI如何處理同一個問題:

PHP
$this->load->database(`websites`);
$query = $this->db->get(`sites`);
foreach ($query->result() as $row) {
    print $row->url
}

複製程式碼



比較字元數: 前者336,後者112。

第二個例子,現在讓我們想像你正在用HTML寫一個資料輸入視窗, 你想要一個下拉輸入框。下拉框中有三個選項。程式碼如下:

HTML
<select name=“type”>
<option value=“1”>www.this.com</option>
<option value=“2”>www.that.com</option>
<option value=“3” selected>www.theother.com</option>
</select>

複製程式碼



CI的寫法和前例一樣,因為它把相關內容放入一個陣列,更容易由PHP進行處理::

PHP
$urlarray = array(
                  `1`  => `www.this.com`,
          `2`  => `www.that.com`,
          `3`  => `www.theother.com`
                  );
 
$variable .= form_dropdown(`url`, $urlarray, `1`);

複製程式碼



在 HTML ,你需要鍵入 167; 在 CI, 148.

使你的網站更安全

你不需要寫很多程式碼, 是因為CI提供了許多標準的功能, 這些經過仔細推敲的框架內的程式碼, 對安全性和輸入進行了有效的校驗和考慮。初學者往往沒有足夠的能力全面兼顧功能和安全(這也是中高階程式中央委員新手之間能力差異的一個方面)

確保你的連結自動更新

設想你正在寫一個選單頁, 有許多超連結可重定向到其他頁。 他們全部以傳統的HTML格式編寫:

<a href=”http://www.mysite.com/index.php/start/hello/fred”>Hello World</a>

然後, 你決定改變這個連結地址。這意謂你必須仔細地去查詢並修改程式碼中的每一處地址, 否則它們將無法正常工作。

CI 給你一個簡單的函式,可以這樣寫超連結:

echo anchor(start/hello/fred, Say hello to Fred);

CI推薦你把你的URL放入一個config檔案供你的指令碼讀取。CI的anchor函式會自動從config檔案中提取相關URL。因此, 當你修改一個URL時,你只需要修改config檔案中的的對應連結,就一次那麼簡單。

防止對資料庫的攻擊: 對錄入資料進行校驗和處理

資料輸入可能引發許多問題。 因為 HTML 和資料庫的限制,資料中總包含特定的符號- 舉例來說, 省略符號和引號-可能導致你的資料庫遭到攻擊,最終得到你無法預料的結果。

解決方案是在把這些資料存入資料庫前對這些資料進行相關處理。 這樣做會浪費一些系統時間, 增加一些額外編碼。

CI的頁面助手會自動地完成這些工作。 因此, 當你編寫一個錄入框時:

echo form_input(`username`,`johndoe`);

CI也隱式地執行下列校驗函式:

PHP
function form_prep($str=) {
{
   if ($str===) {
       return ;
   }
   $temp =`__ TEMP_AMPERSANDS__`;
      
   // 將錄入內容放入臨時變數進行處理以便
   // htmlspecialchars不破壞原資料
   $str= preg_replace(“/(d+);/”, $temp1;”,$str);
   $str= preg_replace(“/&(w+);/”, $temp1;”,$str);
 
   $str= htmlspecialchars($str);
   // htmlspecialchars函式會造成對一些符號的錯誤處理
   $str= str_replace(array(“`”,`”`),array(“`”, “& quot;”), $str);
      
   // 把臨時變數還原到輸入變數中
   $str= preg_replace(“/$temp (d+);/”,1;”,$str);
   $str= preg_replace(“/$temp (w+);/”,“&1;”,$str);
      
   return $str;
}

複製程式碼



上述函式捕獲象`&`這樣的特殊字元, 以便在你的頁面提交時不會造成混亂。你應該知道,有些字元會引起問題。

並不是所有的使用者都會中規中矩地錄入符合要求的資訊,你也不可能知道使用瀏覽器錄入資訊的是什麼人,他們在想什麼,做什麼。你可以使用CI來防上下系統錄入不符合要求的資訊。自然,你大可不必知道CI是如何在幕後為你做到這一切的,你只需要簡單地輸入如下程式碼:

  echo form_input(`username`, `johndoe`);

CI使你寫程式碼更容易了。不象有些類庫如PEAR等,整合比較困難,(有時候你會找不到支援PEAR的空間),CI很容易整合,只要把它放入一個目錄,它就能很好地工作。CI所有的程式碼可讀性好,也很強健,推出前經過社群使用者的認真測試,所以在你可以使用時這些程式碼已經歷了很多考驗。

讓我們看二個例子。

傳送電子郵件非常簡單

傳統的傳送電子郵件功能實現起來比較複雜。CI提供的功能使這件事變得很簡單:

PHP
$this->load->library(`email`);
$this->email->from(`your@your-site.com`, `Your Name`);
$this->email->subject(`Email Text`);
$this->email->message(`Testing the eamil class.`);
$this->email->send();

複製程式碼



實現傳送電子郵件功能中有一些不容易解決的技術問題: 比如文字封裝和傳送附件功能,標準的PHP實現起來比較複雜,CI簡化了這些工作, 它的email類使得傳送附件很簡單:

  $this->email->attach(`/path/to/photo1.jpg`);

CI把內部的複雜部分悄悄地完成了, 舉例來說,實現了列舉近百種不同的附件的MIME型別的功能。所以它知道你的相片photo1.jpg是一個‘image/jpeg`的MIME型別。因此它在在你附件的適當位置填寫必要的限制符號,它細緻地封裝你的文字,使你方便地設定需要標記的文字。

壓縮使用者需要下載的檔案以加快下載速度

為了加快下載速度, 常見的做法是在下載之前壓縮下載檔案。你可能不知道如何處理。但CI可以方便地讓你用四行程式碼完成此功能:

PHP
$name = `mydata1.txt`;
$data = `the contents of my file……`;
$this->zip->add_data($name, $data);
$this->zip->archive(`c:/my_backup.zip`);

複製程式碼



執行這些程式碼,你會在你的C盤根目錄下找到一個壓縮檔案,解壓後即為原始檔案。

你網站的使用者並不清楚你是如何容易地實現下載壓縮檔案的功能,他們能體會到你的網站下載速度很快,而你只用了數分種(而不是數小時)就實現了這個功能。

什麼是框架,什麼是CI?

三百六十行中新增程式設計這一行不久,人們注意到它牽涉了許多可重複的工作。你或者其它人也許不久以後就要用到幾乎同樣的功能,但是你必須花很長的時間來修改它。於是,人們就發明了使用函式庫的方法來重用程式碼。使用PHP的兄弟們也會使用函式庫,並按用途分類儲存到不同的檔案中,在程式設計時用require或include來使用它們。

同樣的,框架是為重用而發明的,放在和你的程式碼分開的目錄中,用來減少重複的勞動。

上面例子中連線資料庫和寫HTML頁面的程式設計工作都可以呼叫相關的CI函式來進行簡化。

有很多種方法實現同樣的功能,大多數的框架會讓你按照它實現的方法來做,一般來說,框架的作者很有經驗,並且作了精心的設計,你可以在幾乎所有的場合下使用。

好的框架設計能實現需要的功能, 而且儘可能地不互相牽連。 一個好框架為你做出各種功能的實現,並且給你提供一步一步的程式設計指導。

提到框架時,就不能不提到有名的框架:Ruby on Rails。

Rails做得相當成功, 因為它藉由最小量的編碼, 明顯地提供簡便快捷的網站開發。 本質上,它是一個結構和一組工具,專為使用Ruby語言的使用者開發,允許你快速建立Ruby系統原型。 它不是Ruby語言中唯一的框架,但是它一定是最有開發效率和最有名的。

為PHP開發的框架有好多個,CI只是其中的一個。 其它的還包括Zend Framework、Cake、 Trax 和其他。 下列網址可以找到一個針對十來種框架的簡明的圖表分析:

http://www.phpit.net/article/ten-different-php-frameworks/。

如果你訪問上述網址中相關產品的官方網站, 你將會注意到,每個論壇都有一個共同的熱點,就是到底哪個一個框架是最好的? 事實似乎是每個都有它的長處,而且又都有自己的弱點。 我的評估標準是: 我很忙; 因此框架應該節約我的時間,從中選擇一個後,就堅持使用下去,因此就有了這篇介紹CI框架的文章。

關於開發者

Rick Ellis開發了CI,他曾經是一個搖滾音樂家,現在是一個軟體設計師。 Rick還是pMachine公司的CEO,該公司還有一個著名的CMS產品叫做Expression Engine. 2006年1月,他在他的部落格中寫道:
(http://ellislab.com)

“我花了數星期時間搜尋和安裝PHP框架, 也被它們中的許多打擊了一把,令我驚訝的是:我發現大多數框架存在以下問題:

. 文件不全或質量很差

. 他們假定你水平很高,希望你能很容易地掌握使用方法

. 他們是為那些有超級使用者許可權或者有權修改伺服器設定的人寫的

. 他們假定你偏愛命令列操作,事實上許多人無此愛好

. 偏愛使用PEAR類庫或其它開原始碼庫

. 模板語法過於複雜

. 有的太笨重,有的又太簡單

. 大多數框架只能在PHP5中執行,只有5%的使用率

我還沒有找到一個簡單的PHP框架, 健壯,易於使用, 文件完整,包含建立一個完整應用需要的所有工具徹底地從頂端被證明到根據,生來地包括不可或缺的建立強健的申請的所有的工具, 並且有一個以瀏覽器為基礎的介面, 使用普通使用者許可權就能安裝。沒有別的原因,就是市場需要這一單一的原因促使我想開發這樣一個框架產品…”

結果是CI誕生了, 作為一個業餘時間開發的作品,Rick慷慨地決定使它成為開源作品。在跑生意間隙,他保持經常更新CI。 他也建立了一個優秀的論壇, CI使用者能提出問題而且分享開發心得。 所有這些資源可從下列網址獲得:
   http://www.codeigniter.com/
   
他能實現自己的設計目標嗎?相信你使用後會得出自己的結論.

CI不能做什麼

CI有它本身的缺點。Rick把CI定義為小的和`輕量級`的結構。(1.5版壓縮後只有737KB可以在幾秒種內下載完畢。Zend Framework是10MB) CI不能解決你所有的問題。 但是它能夠:

. 使PHP程式設計更容易

. 幫助你架構網站或使你更容易地設計架構

作為 `輕量級` 框架的一個結果是它沒有它的對手具有的許多特徵。 象Rails因為它包含 `腳手架`功能和”程式碼生成器”,因此可以為你編寫一些基本的指令碼程式碼。 因此, 舉例來說,一經你已經建立一個資料庫, Rails能自動生成簡單的CRUD指令碼(Create, Read, Update, Delete)。

除此之外,Rails還能讓你編寫`程式碼生成器`-自動地寫其他的簡單指令碼程式碼。Rails社群中有許多這樣的例子,因此你可以做很多智慧化的東西。

CI不這樣做。(有基本的 `腳手架`功能-在CI中,腳手架只給開發者使用。就象線上手冊描述的一樣: “腳手架安全性不夠…如要使用腳手架的話要確保在使用後立即關閉這個功能。在實際執行的網站上不要讓腳手架處在工作狀態。” 說得夠明確了吧?)

相反地CI專注於使基本的東西更容易。它處理的一些事物是:

. session管理和cookie管理 (見第 6 章)

. 資料庫訪問和查詢 (見第 4 章)

. 建立HTML相關內容,如頁面和表單,並檢驗輸入內容。(見第 5 章)

. 測試 (第 8 章)

. 英特網通訊, 使用FTP或 XMLRPC(第 9 章)

很熟悉吧? 這些全部是基本的處理, 如果你正在建立一個動態的網站,你一定會做這些工作。 CI使這些工作更容易, 而且使你的程式碼儘可能更好地工作。

許可證

參見CI下載檔案包

摘要

如果你已經掌握PHP的基本知識並且想“聰明”地編寫動態網站指令碼, CodeIgniter框架會使你的工作更容易,它幫助你:

. 節約時間

. 使你的網站更強健

. 幫助你編寫更復雜的系統

它使你更好地享受程式設計樂趣, 而不是一個幹苦活的體力工。

有相當多的框架, 還有很多是為其它語言開發的。 他們都能減少編碼的重複工作,使編寫複雜程式變得更容易, 而且建立一個合理的系統架構。

這篇文章不製造框架大戰。文章中已經解釋了選擇CI理由,讓它為你節約更多的時間用在學習工作和生活中吧,請享用它!


相關文章