這個(gè)標(biāo)題只是個(gè)引子,雖然 PHP 很簡(jiǎn)單,能夠快速進(jìn)行開(kāi)發(fā),但是也有很多弊病,比如說(shuō)由于缺乏有效的限制從而導(dǎo)致寫出“壞”代碼。那么如何解決這些弊病呢?使用 PHP 開(kāi)發(fā)框架能很好的解決。
使用框架的根本好處就是提升生產(chǎn)力,比如開(kāi)發(fā)效率、開(kāi)發(fā)質(zhì)量、可維護(hù)性等等。
PHP 框架有很多,選擇合適的卻不容易,這篇博文就簡(jiǎn)單說(shuō)說(shuō)框架,假如你是一個(gè)新手,希望能夠幫助你。
框架的基本定義
一個(gè)應(yīng)用程序框架一般是基于一種標(biāo)準(zhǔn)的框架結(jié)構(gòu)、這種結(jié)構(gòu)是你在寫代碼的時(shí)候必須遵守的,同時(shí)框架也提供了很多類庫(kù)和工具,框架結(jié)構(gòu)讓你能夠?qū)懗龈?guī)范的代碼,而工具和類庫(kù)讓你能夠提高開(kāi)發(fā)速度。
一個(gè)框架一般使用 MVC 設(shè)計(jì)模式,設(shè)計(jì)模式很多也很難學(xué),我更傾向稱 MVC 是一種架構(gòu),同時(shí) MVC 也比較容易理解(相對(duì)的)。
框架的基本功能
對(duì)于一個(gè)框架來(lái)說(shuō),功能應(yīng)該包含基礎(chǔ)性功能和功能性功能,基礎(chǔ)性功能是精髓,主要是為了解決 WEB 開(kāi)發(fā)中的核心問(wèn)題,而功能性功能則是錦上添花,一般是解決特定問(wèn)題的類庫(kù)。
- 路由規(guī)則,路由規(guī)則是和代碼的結(jié)構(gòu)一一綁定的。
- 邏輯,模型,視圖分離,這也是建立在 MVC 應(yīng)用架構(gòu)基礎(chǔ)上的。
- 可擴(kuò)展,框架不僅僅讓你去業(yè)務(wù)代碼,也可以由框架創(chuàng)造框架。
- 提供單元測(cè)試工具。
- 應(yīng)用安全機(jī)制。
- 提供強(qiáng)大的日志功能,Debug 功能。
- 大量的類庫(kù)包和工具,框架可以自由的引入第三方的類庫(kù)包(比如 Composer)
框架的好處
那么框架是如何具體提高生產(chǎn)力的呢,歸納如下:
- 避免造輪子,在學(xué)習(xí)過(guò)程中造輪子是一種實(shí)踐,在工作過(guò)程中造輪子不明智(大部分情況如此)。
- 節(jié)省時(shí)間,WEB 項(xiàng)目大部分邏輯可能是相同的(CRUD操作,Session管理,權(quán)限驗(yàn)證),假如不使用框架,就要不斷的重復(fù)寫,這是一種時(shí)間浪費(fèi)。同時(shí)由于沒(méi)有良好的規(guī)約,會(huì)經(jīng)常性犯同樣的錯(cuò)誤。
- 標(biāo)準(zhǔn)化代碼結(jié)構(gòu)
代碼目錄結(jié)構(gòu)如何組織?如何引用文件?對(duì)于這些事情,框架大部分提供了很好的規(guī)約,而你要做的就是去遵循,比如業(yè)務(wù)邏輯應(yīng)該在控制層,數(shù)據(jù)層應(yīng)該在模型層(針對(duì) MVC 模式來(lái)說(shuō)),良好的框架應(yīng)該會(huì)強(qiáng)迫你去遵守,沒(méi)有規(guī)則不成方圓。 - 代碼,系統(tǒng)擴(kuò)展性更好
代碼能夠在Windows上運(yùn)行嗎?代碼能在所有 PHP 版本中運(yùn)行嗎?底層數(shù)據(jù)庫(kù)從Mysql換成Sqlserver,代碼還能運(yùn)行嗎?框架基本上能優(yōu)雅的解決這些問(wèn)題,讓你專注于業(yè)務(wù)編寫,排除其他的干擾(當(dāng)然這樣的干擾對(duì)學(xué)習(xí)很有幫助)。 - 系統(tǒng)更安全
誰(shuí)也不能保證自己寫的代碼是完全安全的,而框架經(jīng)過(guò)千錘百煉,提供了很好的代碼保護(hù)(你甚至可能不知道如何是保護(hù)的),從結(jié)果上來(lái)說(shuō),框架會(huì)限制你的行為,會(huì)提供好的工作機(jī)制讓代碼更安全。 - 提高代碼質(zhì)量
框架能夠讓編寫的代碼更安全,更容易維護(hù),更好讀。 - 充分利用開(kāi)源的力量
框架 80% 的部分提供了很多包(稱為類庫(kù))和 工具,這些包和工具解決了很多復(fù)雜的問(wèn)題,比如說(shuō)快速通過(guò)這些包生成驗(yàn)證碼,通過(guò)工具快速構(gòu)建一個(gè)數(shù)據(jù)庫(kù)表。這也說(shuō)明了二點(diǎn),你要盡可能的使用穩(wěn)定的開(kāi)源包,另外也避免了造輪子。
什么樣的框架是好的
選擇框架的標(biāo)準(zhǔn)很重要,每個(gè)人的編碼能力,理解能力,工作特點(diǎn),這些驅(qū)使你應(yīng)該選擇合適的框架,而不是最流行的框架。
- 要注意框架的執(zhí)行速度,使用框架可能節(jié)省開(kāi)發(fā)時(shí)間,但是帶來(lái)部分性能和速度的損耗,這是需要平衡的。不過(guò)個(gè)人覺(jué)得性能的瓶頸不在框架,應(yīng)該強(qiáng)調(diào)你的業(yè)務(wù)設(shè)計(jì)。
- 簡(jiǎn)單的,學(xué)習(xí)成本要低,PHP 本身很容易使用和學(xué)習(xí),大部分框架使用了很多設(shè)計(jì)模式,但是對(duì)于大部分人來(lái)說(shuō)強(qiáng)調(diào)的是快速編碼,假如不是特別理解這個(gè)框架的設(shè)計(jì),那么使用這個(gè)框架的成本就太高了,另外由于框架在 PHP 上做了過(guò)多的封裝,那你面對(duì)的也許就不是 PHP 語(yǔ)言了,所以建議選用相對(duì)簡(jiǎn)單的框架,除非你有特殊需求。
- 良好的框架學(xué)習(xí)和使用文檔,社區(qū)對(duì)這個(gè)框架的支持程度,對(duì)我來(lái)說(shuō)就是中文文檔有沒(méi)有。
- 限制不要太多
很多框架會(huì)限制你很多編碼方式,就是說(shuō)不提倡使用原生的 PHP 功能,比如我學(xué)習(xí)Javascript的時(shí)候先學(xué)習(xí)的是JQuery,到最后分不清什么是 Javascript 語(yǔ)言了。一個(gè)框架應(yīng)該是靈活的,限制太多會(huì)導(dǎo)致使用成本變高。 - 可擴(kuò)展
一個(gè)框架應(yīng)該是自由的,你可以使用這個(gè)框架最精華的部分,其他的部分(比如一些特定任務(wù)的類庫(kù))應(yīng)該是可選的,同時(shí)這個(gè)框架還容易引入第三方優(yōu)秀的庫(kù)。
那為什么選擇 Codeigniter
Codeigniter 給人初始的感覺(jué)太老了,其實(shí)這是一種誤區(qū),它支持大部分的 PHP 版本,雖然沒(méi)有什么高級(jí)特性,但足夠用了。
只要簡(jiǎn)單了解其 MVC 設(shè)計(jì),包括常規(guī)的幾個(gè)主題(路由,數(shù)據(jù)庫(kù),日志等)就基本上可以開(kāi)發(fā)了,我花了半天的時(shí)間基本上就學(xué)會(huì)使用了。
Codeigniter 的文檔也不錯(cuò),看起來(lái)絲毫不費(fèi)力。
Codeigniter 安裝也很簡(jiǎn)單,將包拷貝下來(lái)放到虛擬主機(jī)上就能運(yùn)行,想想 Laravel 的安裝(不適合初學(xué)者)。
另外使用 Codeigniter 沒(méi)有太多的約束,要是覺(jué)得某個(gè)功能不好用(吐槽其日志類庫(kù),將框架運(yùn)行的信息和應(yīng)用的信息混合在一塊,等同雞肋),可以隨意使用第三方庫(kù)。
其實(shí)最重要的還是簡(jiǎn)單,不管是使用還是學(xué)習(xí)。
假如你是一個(gè)初學(xué)者,為了讓學(xué)習(xí) PHP 過(guò)程更輕松可以選擇它, 假如要快速開(kāi)發(fā)可以選擇它,假如要研究框架也可以選擇它。