PHP MVC模式在網(wǎng)站架構(gòu)中的實(shí)現(xiàn)分析
視圖(View)
“視圖”主要指我們送到Web瀏覽器的最終結(jié)果??比如我們的腳本生成的HTML。當(dāng)說(shuō)到視圖時(shí),很多人想到的是模版,但是把模板方案叫做視圖的正確性是值得懷疑的。
對(duì)視圖來(lái)說(shuō),最重要的事情可能是它應(yīng)該是“自我意識(shí)(self aware)”的,視圖被渲染(render)時(shí),視圖的元素能意識(shí)到自己在更大框架中的角色。
以XML為例,可以說(shuō)XML在被解析時(shí),DOM API有著這樣的認(rèn)知??一個(gè)DOM樹(shù)里的節(jié)點(diǎn)知道它在哪里和它包含了什么。 (當(dāng)一個(gè)XML文檔中的節(jié)點(diǎn)用SAX解析時(shí)只有當(dāng)解析到該節(jié)點(diǎn)時(shí)它才有意義。)
絕大多數(shù)模板方案使用簡(jiǎn)單的過(guò)程語(yǔ)言和這樣的模板標(biāo)簽:
<p>{some_text}</p> |
它們?cè)谖臋n中沒(méi)有意義,它們代表的意義只是PHP將用其他的東西來(lái)替換它。
如果你同意這種對(duì)視圖的松散描述,你也就會(huì)同意絕大多數(shù)模板方案并沒(méi)有有效的分離視圖和模型。模板標(biāo)簽將被替換成什么存放在模型中。
在你實(shí)現(xiàn)視圖時(shí)問(wèn)自己幾個(gè)問(wèn)題:“全體視圖的替換容易嗎?”“實(shí)現(xiàn)一個(gè)新視圖要多久?” “能很容易的替換視圖的描述語(yǔ)言嗎?(比如在同一個(gè)視圖中用SOAP文檔替換HTML文檔)”
模型(Model)
模型代表了程序邏輯。(在企業(yè)級(jí)程序中經(jīng)常稱為業(yè)務(wù)層(business layer))
總的來(lái)說(shuō),模型的任務(wù)是把原有數(shù)據(jù)轉(zhuǎn)換成包含某些意義的數(shù)據(jù),這些數(shù)據(jù)將被視圖所顯示。通常,模型將封裝數(shù)據(jù)查詢,可能通過(guò)一些抽象數(shù)據(jù)類(數(shù)據(jù)訪問(wèn)層)來(lái)實(shí)現(xiàn)查詢。舉例說(shuō),你希望計(jì)算英國(guó)年度降雨量(只是為了給你自己找個(gè)好點(diǎn)的度假地),模型將接收十年中每天的降雨量,計(jì)算出平均值,再傳遞給視圖。
控制器(controller)
簡(jiǎn)單的說(shuō)控制器是Web應(yīng)用中進(jìn)入的HTTP請(qǐng)求最先調(diào)用的一部分。它檢查收到的請(qǐng)求,比如一些GET變量,做出合適的反饋。在寫(xiě)出你的第一個(gè)控制器之前,你很難開(kāi)始編寫(xiě)其他的PHP代碼。最常見(jiàn)的用法是index.php中像switch語(yǔ)句的結(jié)構(gòu):
<?php |
這段代碼混用了面向過(guò)程和對(duì)象的代碼,但是對(duì)于小的站點(diǎn)來(lái)說(shuō),這通常是最好的選擇。雖然上邊的代碼還可以優(yōu)化。
控制器實(shí)際上是用來(lái)觸發(fā)模型的數(shù)據(jù)和視圖元素之間的綁定的控件。
例子
這里是一個(gè)使用MVC模式的簡(jiǎn)單例子。
首先我們需要一個(gè)數(shù)據(jù)庫(kù)訪問(wèn)類,它是一個(gè)普通類。
<?php ; // Perform query here |
在它上邊放上模型。
<?php |
有一點(diǎn)要注意的是,在模型和數(shù)據(jù)訪問(wèn)類之間,它們的交互從不會(huì)多于一行??沒(méi)有多行被傳送,那樣會(huì)很快使程式慢下來(lái)。同樣的程式對(duì)于使用模式的類,它只需要在內(nèi)存中保留一行(Row)??其他的交給已保存的查詢資源(query resource)??換句話說(shuō),我們讓MYSQL替我們保持結(jié)果。
接下來(lái)是視圖??我去掉了HTML以節(jié)省空間,你可以查看這篇文章的完整代碼。
<?php |
最后是控制器,我們將把視圖實(shí)現(xiàn)為一個(gè)子類。
<?php |
注意這不是實(shí)現(xiàn)MVC的唯一方式??比如你可以用控制器實(shí)現(xiàn)模型同時(shí)整合視圖。這只是演示模式的一種方法。
我們的index.php 文件看起來(lái)像這樣:
<?php |
漂亮而簡(jiǎn)單。
我們有一些使用控制器的技巧,在PHP中你可以這樣做:
$this->{$_GET['method']}($_GET['param']); |
一個(gè)建議是你最好定義程序URL的名字空間形式(namespace),那樣它會(huì)比較規(guī)范比如:
"index.php?class=ProductView&method=productItem&id=4" |
通過(guò)它我們可以這樣處理我們的控制器:
$view=new $_GET['class']; |
有時(shí)候,建立控制器是件很困難的事情,比如當(dāng)你在開(kāi)發(fā)速度和適應(yīng)性之間權(quán)衡時(shí)。一個(gè)獲得靈感的好去處是Apache group 的Java Struts,它的控制器完全是由XML文檔定義的。
- java學(xué)生信息管理系統(tǒng)MVC架構(gòu)詳解
- SpringMVC架構(gòu)的項(xiàng)目 js,css等靜態(tài)文件導(dǎo)入有問(wèn)題的解決方法
- thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等】
- SpringMVC互聯(lián)網(wǎng)軟件架構(gòu)REST使用詳解
- mvc架構(gòu)實(shí)現(xiàn)商品的購(gòu)買(mǎi)(二)
- ASP.NET MVC5網(wǎng)站開(kāi)發(fā)之展示層架構(gòu)(五)
- ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之業(yè)務(wù)邏輯層的架構(gòu)和基本功能(四)
- ssi框架學(xué)習(xí)總結(jié)(mvc三層架構(gòu))
- MayFish PHP的MVC架構(gòu)的開(kāi)發(fā)框架
- SpringMVC MVC架構(gòu)原理及實(shí)現(xiàn)方法詳解
相關(guān)文章
控制PHP的輸出:緩存并壓縮動(dòng)態(tài)頁(yè)面
PHP4中最令人滿意的事是——你可以讓PHP緩存所有由腳本生成的輸出,在你決定把它們送出之前,瀏覽器方是不會(huì)收到任何內(nèi)容的2013-06-06PHP實(shí)現(xiàn)鏈表的定義與反轉(zhuǎn)功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)鏈表的定義與反轉(zhuǎn)功能,結(jié)合實(shí)例形式分析了PHP鏈表的基本定義、添加、移除、遍歷以及兩種反轉(zhuǎn)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-06-06PHP實(shí)現(xiàn)帶進(jìn)度條的Ajax文件上傳功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)帶進(jìn)度條的Ajax文件上傳功能,結(jié)合實(shí)例形式分析了php+ajax文件上傳基礎(chǔ)上添加進(jìn)度條功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07PHP列出MySQL中所有數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了PHP列出MySQL中所有數(shù)據(jù)庫(kù)的方法,涉及php操作數(shù)據(jù)庫(kù)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03centos下file_put_contents()無(wú)法寫(xiě)入文件的原因及解決方法
下面小編就為大家?guī)?lái)一篇centos下file_put_contents()無(wú)法寫(xiě)入文件的原因及解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04PHP實(shí)現(xiàn)PDO操作mysql存儲(chǔ)過(guò)程示例
這篇文章主要介紹了PHP實(shí)現(xiàn)PDO操作mysql存儲(chǔ)過(guò)程,結(jié)合具體實(shí)例形式分析了php使用pdo操作mysql存儲(chǔ)過(guò)程實(shí)現(xiàn)用戶注冊(cè)功能相關(guān)技巧,需要的朋友可以參考下2019-02-02PHP使用mysql_fetch_object從查詢結(jié)果中獲取對(duì)象集的方法
這篇文章主要介紹了PHP使用mysql_fetch_object從查詢結(jié)果中獲取對(duì)象集的方法,實(shí)例分析了php操作mysql_fetch_object查詢數(shù)據(jù)庫(kù)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03