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

原文: 使用 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

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+);/" ,  "$temp\1;" , $str ) ;
    $str =  preg_replace ( "/&(w+);/" ,  "$temp\1;" , $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理由,讓它爲你節約更多的時間用在學習工做和生活中吧,請享用它!
相關文章
相關標籤/搜索