原文:
使用 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寫一個數據輸入窗口, 你想要一個下拉輸入框。下拉框中有三個選項。代碼以下:
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理由,讓它爲你節約更多的時間用在學習工做和生活中吧,請享用它!