《PHP學(xué)習(xí):php實現(xiàn)的單一入口應(yīng)用程序?qū)嵗治觥芬c:
本文介紹了PHP學(xué)習(xí):php實現(xiàn)的單一入口應(yīng)用程序?qū)嵗治觯M麑δ杏谩H绻幸蓡枺梢月?lián)系我們。
PHP教程本文較為詳細(xì)的分析了php單一入口應(yīng)用程序.分享給大家供大家參考.具體如下:
PHP教程什么是單一入口應(yīng)用程序?
PHP教程在解釋什么是單一入口應(yīng)用程序之前,我們先來看看傳統(tǒng)的 web 應(yīng)用程序.
news.php 顯示新聞列表
news_edit.php 顯示新聞編輯頁面
這兩個頁面不但分別實現(xiàn)了兩個功能,還成為了應(yīng)用程序的兩個入口.
PHP教程那什么是入口啊?
PHP教程打個比方,大家上 WC,都是男生進(jìn)一個門,女生進(jìn)一個門.這兩個門就是 WC 的兩個入口.
PHP教程呵呵,上面的例子應(yīng)該很好理解吧.那稍微變換一下,單一入口的概念就很容易理解了.
現(xiàn)在我們是進(jìn)一個公共 WC,不管男女都是從最外面的入口進(jìn)入,交了錢以后才分別進(jìn)兩個門.那最外面的入口就是這個 WC 的單一入口.
PHP教程所以單一入口的應(yīng)用程序?qū)嶋H上就是說用一個文件處理所有的 HTTP 哀求.例如不管是新聞列表功能還是新聞編輯功能,都是從瀏覽器訪問 index.php 文件.這個 index.php 文件就是這個應(yīng)用程序的單一入口.
PHP教程index.php 如何知道用戶是要使用哪一個功能呢?
PHP教程很簡單,我們拜訪 index.php 時跟上一個特定的參數(shù)就行了.例如 index.php?action=news 就是顯示新聞列表,而 index.php?action=news_edit 就是新聞編輯.
PHP教程而在 index.php 里面,僅用兩行代碼就可以實現(xiàn)這種效果.
PHP教程
<?php
$action = $_GET['action'] == '' ? 'index' : $_GET['action'];
include('files/' . $action . '.php');
?>
PHP教程上面的代碼中,第一行是從 url 中取出 action 參數(shù).如果沒有提供 action 參數(shù),就設(shè)置一個默認(rèn)的 'index' 作為參數(shù).
第二行代碼就是根據(jù) $action 參數(shù)調(diào)用不同的代碼文件,從而實現(xiàn)單一入口對應(yīng)不同功能的效果.
PHP教程單一入口應(yīng)用程序的入口文件很復(fù)雜?
PHP教程有些朋友可能以為單一入口程序的 index.php 會像面條一樣復(fù)雜,其實是誤解.
例如我現(xiàn)在的應(yīng)用程序入口文件只有下面幾行:
PHP教程
<?php
define('APP', realpath('../libs/website'));
define('LANG', 'gb2312');
define('DEBUG', 1);
require('../libs/flea1/basic.php');
run();
?>
PHP教程足夠簡單了吧?
PHP教程當(dāng)然了,在 index.php 里面寫上一長串 switch case 絕對是拙劣的實現(xiàn)方式.但這純粹是開發(fā)者自己的設(shè)計和實現(xiàn)問題,而不是單一入口應(yīng)用程序這種設(shè)計思想的問題.
PHP教程補(bǔ)充說明: 這里提到 switch case 并不是說用了 switch 就代表“落后”、“土氣”等.只是說在 index.php 這個入口程序里面寫上一堆 switch case 不利于程序的修改和維護(hù),所以是一種不好的用法.
PHP教程單一入口應(yīng)用程序的設(shè)計思想
PHP教程當(dāng)web服務(wù)器(apache或者iis)收到一個http哀求時,會解析該哀求,確定要訪問哪一個文件.例如 http://www.xxx.com/news.php 的解析結(jié)果就是要求web服務(wù)器解析 news.php 文件,并返回結(jié)果給瀏覽器.現(xiàn)在看看單一入口應(yīng)用程序的 index.php 文件,就會發(fā)現(xiàn) index.php 實際上根據(jù) url 參數(shù)進(jìn)行了第二次解析.
PHP教程完成這個解析的程序一般稱為 Dispatcher(中文的準(zhǔn)確翻譯我也不知道),大概意思就是將不同的哀求轉(zhuǎn)發(fā)到不同的處理程序進(jìn)行處理.
PHP教程在單一入口應(yīng)用程序中,index.php 和 web服務(wù)器一起構(gòu)成了一個 Dispatcher,根據(jù) http 哀求和 url 參數(shù)來確定哀求的處理程序.
PHP教程了解了 Dispatcher 的概念后,我們可以發(fā)現(xiàn)前面提到的兩行代碼實際上就是一個最簡單的 Dispatcher 實現(xiàn):
PHP教程
<?php
$action = $_GET['action'] == '' ? 'index' : $_GET['action'];
include('files/' . $action . '.php');
?>
PHP教程誠然,對于一個平安、健壯的應(yīng)用程序,Dispatcher 肯定不是上面那么簡單.在調(diào)用實際代碼前,還會加上各種判斷、平安性檢查等.例如判斷 url 指定的功能是否可以訪問以及 url 中包含了無效的參數(shù).
PHP教程看到這里,朋友們肯定會說:單一入口程序就多了就這樣一個 dispatcher ,和我直接做成 news.php、news_edit.php 等單個文件相比有什么好處啊?
PHP教程單一入口應(yīng)用程序的優(yōu)勢
PHP教程單一入口應(yīng)用程序的所有http哀求都是通過 index.php 接收并轉(zhuǎn)發(fā)到功能代碼去的,所以我們在 index.php 里面就能完成許多實際工作.
PHP教程這里我只拿平安性檢查為例詳細(xì)說明一下:
PHP教程由于所有的 http 哀求都由 index.php 接收,所以可以進(jìn)行集中的安全性檢查.如果不是單一入口,那么開發(fā)者就必須記得在每一個文件的開始加上安全性檢查代碼(當(dāng)然,安全性檢查代碼可以寫到另一個文件中,只需要include進(jìn)來就可以了).
但我想大家都是懶人,也許記性也不好,難免有忘記的時候.因此要記得在每一個文件前面都加上必要的include可不是件容易做到的事情.
PHP教程與平安性檢查類似.在入口里,我們還可以對url參數(shù)和post進(jìn)行必要的檢查和特殊字符過濾、記錄日志、訪問統(tǒng)計等等各種可以集中處理的任務(wù).
PHP教程“咦,搞這么多功能,不是會把 index.php 搞得很復(fù)雜嗎?”
“不會的.只需要把各種功能寫到單獨的文件,然后在index.php里面include進(jìn)來就可以了!”
PHP教程可以看出,由于這些工作都被集中到了 index.php 來完成,可以減輕我們維護(hù)其他功能代碼的難度.例如在10個文件中保持頭部的幾個include都一致可不是件讓人愉快的事情.
PHP教程單一入口應(yīng)用程序的缺點
PHP教程任何事情都有兩面性,單一入口應(yīng)用程序也不例外.由于所有 http 哀求都是針對 index.php,所以應(yīng)用程序的 url 看起來確實不那么美觀.特別是對搜索引擎來說很不友好.
PHP教程要解決這個問題,可以采用 url 重寫、PATHINFO 等方式.但我個人更推薦在前臺頁面不使用單一入口方式,而是保持多個文件入口.或者兩者混用.例如新聞列表采用單獨的 news.php 顯示,而用戶注冊、頒發(fā)信息等則采用單一入口.因為對于網(wǎng)站擁有者來說,新聞列表、新聞顯示頁面才是需要搜索引擎關(guān)注的高價值目標(biāo),而用戶注冊頁面等交互性功能則根本沒有收錄的價值.
PHP教程有朋友提到單一入口的應(yīng)用程序會有很長一串參數(shù),那么我們分析一下下面這個 url:
index.php?url=news&news_id=123&page=2&sort=title
如果改為直接訪問 news.php,也只不過省掉了 url=news 這一個參數(shù)罷了.
PHP教程所以認(rèn)為單一入口的應(yīng)用程序 url 太復(fù)雜是沒有道理的.
PHP教程如何組織單一入口應(yīng)用程序的功能代碼?
PHP教程單一入口應(yīng)用程序最大的挑戰(zhàn)來自于如何合理組織各個功能的處理代碼.但只要遵循一定的步驟,也可以輕松的辦理掉這個難題.
PHP教程首先,對于應(yīng)用程序的功能要做出一個合理的分解.例如后臺的新聞欄目可能包含“添加新聞”、“編輯新聞”、“刪除新聞”等多個功能.這時我們就可以將這一組邏輯上關(guān)聯(lián)的功能組合到一個功能模塊中,稱為“新聞管理”模塊.
依照上面的方法整理完應(yīng)用程序的功能,我們就會得到多個功能模塊,而每個模塊又是由多個功能組成.(實際上,即便不是單一入口應(yīng)用程序,功能的整理也是必須的步驟.)
PHP教程整理完功能后,我們就需要確定如何存放各個功能的代碼.這里我推薦兩種方式:
PHP教程1、每個功能模塊一個子目錄,目錄里的每一個文件就是一個功能的實現(xiàn)代碼.
這種方式的好處是每個功能的代碼都互相隔離,非常便于多人協(xié)作.缺點是每個功能之間共享代碼和數(shù)據(jù)不那么方便.例如新聞管理模塊中的所有功能都需要一個“取出新聞欄目記錄”的功能,那么采用這種多個獨立文件的組織方式,“取出新聞欄目記錄”就只能寫在另一個文件中,然后由需要該功能的文件include進(jìn)去.
PHP教程2、每個模塊一個文件,模塊中的每個功能寫成一個函數(shù)或者一個類辦法.
好處不用多說了,非常便于共享代碼和數(shù)據(jù).缺點就是如果幾個人同時改,容易發(fā)生沖突.不過借助版本控制軟件和差異比較合并工具,沖突還是很容易解決的.
PHP教程好了,我們的功能代碼都確定存放方式了.那么如何調(diào)用呢?
PHP教程index.php 如何調(diào)用功能代碼?
PHP教程調(diào)用首先就是要設(shè)計一個規(guī)則,然后讓 index.php 根據(jù)這個規(guī)則來搜索和調(diào)用功能代碼.就我自己來說,我總是使用 $_GET['url'] 來指定要調(diào)用的功能模塊,而 $_GET['action'] 來指定該模塊的特定功能.因此我的應(yīng)用程序會使用如下的 url 地址:
index.php?url=news&action=edit
PHP教程覺得兩個參數(shù)太多了?那可以使用 index.php?func=news.edit 這樣的 url.只需要將 news.edit 拆開為 news 和 edit 就行了.
PHP教程“嘿嘿,那我故意搞一個 index.php?url=news&action=xxx,看你的應(yīng)用程序還能運行?”
很顯然,這樣的 url 只會使得 index.php 無法找到需要的功能代碼,最后報告錯誤.但是這和你在瀏覽器中拜訪 newsxxx.php 這個并不存在的文件有什么本質(zhì)區(qū)別呢?
PHP教程相反,我還可以讓 index.php 在發(fā)現(xiàn)找不到需要的功能代碼時顯示一個漂亮的出錯頁面,并提供一個返回網(wǎng)站首頁的連接.
PHP教程在實際開發(fā)中,我傾向于將一些基本服務(wù)從應(yīng)用程序中抽取出來,形成一個應(yīng)用程序框架.這個框架通常會包含一個 Dispatcher、基本的數(shù)據(jù)庫拜訪服務(wù)、模版引擎、常用的輔助功能等.由于有了一個框架,所以我可以更加讓 Dispatcher 更加靈活.例如可以對某些功能模塊應(yīng)用權(quán)限檢查,而另一些則不檢查.
PHP教程進(jìn)一步了解單一入口應(yīng)用程序
PHP教程要深刻理解一個事物,自己嘗試一下是最好的方法.
PHP教程你可以選擇自己實現(xiàn)一個 Dispatcher 以及相應(yīng)的各種規(guī)則,或者選擇一個現(xiàn)有的應(yīng)用程序框架.但更好的方式還是首先嘗試一下現(xiàn)有的框架,然后再自己嘗試實現(xiàn)一個類似的.這樣可以在最短的時間內(nèi)獲得最多的收獲.
PHP教程目前絕大多數(shù) php 應(yīng)用程序框架都是單一入口的,并采用了 MVC 模式(很遺憾,由于 MVC 實在太復(fù)雜,并且和單一入口應(yīng)用程序也沒有必然聯(lián)系,所以我就不贅述了.感興趣的朋友可以 google 一下相關(guān)資料).
PHP教程我個人推薦下面的框架:
PHP教程FleaPHP
http://www.fleaphp.org/
嗯,我在做廣告.因為這個框架是我做的.但我相信這個框架將是一個非常容易上手(就算不是最容易的)框架.
全中文的代碼注釋、簡單的結(jié)構(gòu)、精簡的代碼都是 FleaPHP 框架的優(yōu)勢.
PHP教程CakePHP
http://www.cakephp.org/
一個 Ruby on Rails 的 PHP 仿制品.具有出色的功能,但顯然太過于復(fù)雜,而且缺乏中文資料是個很大的問題.
PHP教程symfony
http://www.symfony-project.com/
一個超復(fù)雜的框架,集成了 n 多東西.項目網(wǎng)站上提供的視頻演示看上去很不錯.
PHP教程其他
還有 Mojavi、Phing 等許多 PHP 框架,如果你精力充沛,可以去探索一下.
PHP教程希望本文所述對大家的php程序設(shè)計有所贊助.
歡迎參與《PHP學(xué)習(xí):php實現(xiàn)的單一入口應(yīng)用程序?qū)嵗治觥酚懻摚窒砟南敕ǎS易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/8719.html