MVC初遇

???? 在之前的學(xué)習(xí)過程中锐借,包括AngularJs還有知道的安卓裙犹、IOS開發(fā)都離不開基本的MVC模型,但是MVC模型具有很強(qiáng)的抽象性象对,至少對(duì)于我來說是這樣的黑忱。


第一次深入理解,是針對(duì)ThinkPHP框架的MVC理解:(主要參考站長(zhǎng)之家的文獻(xiàn)內(nèi)容——轉(zhuǎn)載請(qǐng)注明出處 作者:劉東信(bitpart) 原文地址:http://www.wodianer.net/article_52_PHP-MVC.html

什么是MVC勒魔?

簡(jiǎn)單的說就是將網(wǎng)站源碼分類甫煞、分層。

MVC三個(gè)字母的含義:

M:Model?模型冠绢,負(fù)責(zé)數(shù)據(jù)庫操作抚吠。

V:View?視圖,負(fù)責(zé)調(diào)用Model調(diào)取數(shù)據(jù)弟胀,再調(diào)用模板楷力,展示出最終效果。

C:Controller?控制器孵户,程序的入口萧朝,決定改調(diào)用哪個(gè)View,并告訴View該做什么延届。

如此說來剪勿,程序的執(zhí)行順序是C-V-M?或?C-M?,和MVC的名字正好相反方庭。

為什么要MVC厕吉?

1.能使網(wǎng)站程序物理結(jié)構(gòu)更合理酱固。

當(dāng)用PHP建設(shè)一個(gè)網(wǎng)站的時(shí)候,最笨的方法头朱,你可能把每個(gè)頁面建成一個(gè)PHP文件运悲。如果你的網(wǎng)站只有index.php,menu.php.article.php?三個(gè)頁面项钮,那你可以不用MVC班眯,但我們做一般的網(wǎng)站的時(shí)候,動(dòng)輒幾十個(gè)頁面烁巫,把所有頁面放在根目錄顯然不是我們所能接受的署隘,于是你需要一個(gè)合理的思想去將你的代碼分類,按功能把他們分成不同的目錄亚隙,且由程序智能的載入調(diào)用磁餐,這就是MVC要幫助你做的。

2.使代碼更容易維護(hù)阿弃。

我們?cè)賮砜磫蝹€(gè)頁面诊霹,最笨的方法,就是PHP代碼與HTML代碼混合渣淳,這顯然不夠好脾还,你在維護(hù)網(wǎng)站的時(shí)候不得不區(qū)分哪里是PHP,哪里是HTML入愧,這對(duì)于一個(gè)程序員來說鄙漏,簡(jiǎn)直只災(zāi)難。于是很多人就使用Smarty棺蛛,這樣就可以將“數(shù)據(jù)處理”與“頁面展示”分開來泥张,這樣做的確不錯(cuò),也有很多人正在這么做鞠值,但這還不是MVC,MVC要做的就是將“數(shù)據(jù)處理”再分為“邏輯處理”與“數(shù)據(jù)庫操作”渗钉,這就是所說的分層彤恶。

這樣當(dāng)你的程序錯(cuò)誤或想要修改的時(shí)候,就變得很輕松了鳄橘,當(dāng)頁面顯示錯(cuò)誤的時(shí)候声离,你就去檢查V或模板文件;當(dāng)邏輯有問題的時(shí)候瘫怜,你就去檢查C和V术徊;當(dāng)你數(shù)據(jù)庫操作錯(cuò)誤就去檢查M。

其實(shí)MVC一般要把PHP的一個(gè)頁面分割為4個(gè)頁面鲸湃,分別是C赠涮,V子寓,M,模板笋除。各司其職斜友,方便管理。

3.有利于代碼復(fù)用垃它。

MVC會(huì)把一般會(huì)把一個(gè)大的功能放在一個(gè)目錄下鲜屏,也就是由一個(gè)C去管理。

例如要做一個(gè)含有會(huì)員系統(tǒng)的網(wǎng)站国拇,我們就可以把會(huì)員相關(guān)的代碼都放到user目錄里洛史,由User_Controller統(tǒng)一管理,當(dāng)我們另一個(gè)網(wǎng)站也需要會(huì)員系統(tǒng)的時(shí)候酱吝,我們就可以直接把這個(gè)目錄復(fù)制過去也殖,修改一下接口就可以了。

PHP實(shí)現(xiàn)MVC的思路

我們需要三個(gè)基類:Controller掉瞳、View毕源、Model?,然后不同的C陕习、V霎褐、M分別繼承他們就有對(duì)應(yīng)的屬性與方法了,如果這里你不理解该镣,可以去看看面向?qū)ο蟮臅?/p>

我給大家提供一種MVC基類的設(shè)計(jì)思路冻璃,僅供參考:

1.?Controller類的設(shè)計(jì)

一個(gè)main()方法,供程序調(diào)用损合,主要是通過get和post變量決定該如何處理省艳。

一個(gè)getModel($model)方法,在需要調(diào)用數(shù)據(jù)庫的時(shí)候嫁审,調(diào)用對(duì)應(yīng)目錄的M跋炕。

一個(gè)display($view)方法,在main()方法中調(diào)用律适,載入對(duì)應(yīng)的V辐烂,并掉應(yīng)V的main()方法;

2.View類的設(shè)計(jì)與Controller很相似

一個(gè)main()方法捂贿,當(dāng)C載入V的時(shí)候調(diào)用這個(gè)方法纠修,使程序能繼續(xù)執(zhí)行下去。

一個(gè)getModel($model)方法厂僧,在需要調(diào)用數(shù)據(jù)庫的時(shí)候扣草,調(diào)用對(duì)應(yīng)目錄的M。

一個(gè)display($template),調(diào)用對(duì)應(yīng)的模板文件辰妙,并把數(shù)據(jù)傳遞給模板鹰祸。

3.Model類的設(shè)計(jì)

可以定義一些屬性,例如要操作那些表上岗,操作那些字段等福荸。

一個(gè)getDB()方法,獲得一個(gè)數(shù)據(jù)庫類的實(shí)例肴掷,(數(shù)據(jù)庫類一般都是用單件模式設(shè)計(jì)的)

一個(gè)load()方法敬锐,載入一個(gè)數(shù)據(jù)。

一個(gè)add()方法呆瞻,可以根據(jù)定義好的屬性自動(dòng)構(gòu)造SQL語句台夺,并執(zhí)行插入操作。

一個(gè)eidt()方法痴脾,同上颤介,但執(zhí)行修改操作。

一個(gè)del()方法赞赖,同上滚朵,但執(zhí)行刪除操作。

為了能使新手更好的理解我這個(gè)思路的工作原理前域,我們現(xiàn)在模擬一個(gè)用戶登錄的場(chǎng)景辕近,看看MVC是如何工作的。

現(xiàn)在假設(shè)匿垄,所有的數(shù)據(jù)都提交給index.php移宅,

第一步:

我們提交各get變量,告訴index.php該用哪個(gè)C椿疗,例如可以這樣index.php漏峰?controller=user

然后index接收到get變量,什么也不需要做届榄,直接找到/user/controller.php浅乔,把所有數(shù)據(jù)丟給他,本來GET和POST就是全局的铝条,所以index.php也不需要做什么童擎,直接調(diào)用C的main函數(shù)就可以了,到此index.php的任務(wù)完成攻晒。

第二步:

C的main函數(shù)開始執(zhí)行,檢查變量班挖,發(fā)現(xiàn)用戶要執(zhí)行的登錄操作(很簡(jiǎn)單鲁捏,你post個(gè)變量do=login就可以了),于是調(diào)用getModel,載入對(duì)應(yīng)的M類(例如/user/models/model.php)给梅,并實(shí)例化假丧,?調(diào)用實(shí)例的load方法,載入該用戶的數(shù)據(jù)資料动羽,判斷是否與用戶提交的密碼一致包帚,如果提交的數(shù)據(jù)不正確header跳轉(zhuǎn)到出錯(cuò)頁面,如果正確运吓,調(diào)用display()方法渴邦,載入對(duì)應(yīng)的V(例如/user/views/details.php),并實(shí)例化拘哨,調(diào)用其main()函數(shù)谋梭,進(jìn)入第三步。到此C的任務(wù)已完成倦青,第二不操作均在main函數(shù)中進(jìn)行。

第三步:

你可以選擇調(diào)用getModel()載入M,重寫調(diào)取數(shù)據(jù)眷唉,也可以在C實(shí)例化V的時(shí)候九串,把參數(shù)傳過來(例如SESSION),當(dāng)V已經(jīng)確定得到數(shù)據(jù)以后癣亚,display()丑掺,載入模板,MVC執(zhí)行完畢逃糟。

當(dāng)然吼鱼,由于字?jǐn)?shù)與精力限制,這里寫的只是非常簡(jiǎn)要的概括绰咽,實(shí)際實(shí)施的時(shí)候要考慮很多細(xì)節(jié)菇肃,但我設(shè)計(jì)MVC的時(shí)候,大概思路就是這樣取募,也用到了實(shí)際中琐谤,感覺良好。

這篇文章不算軟文玩敏,寫都是實(shí)際的東西斗忌,希望對(duì)新手有幫助,如果你讀不懂旺聚,對(duì)不起织阳,我文筆有限。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砰粹,一起剝皮案震驚了整個(gè)濱河市唧躲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖弄痹,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饭入,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肛真,警方通過查閱死者的電腦和手機(jī)谐丢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚓让,“玉大人乾忱,你說我怎么就攤上這事∑敬” “怎么了饭耳?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)执解。 經(jīng)常有香客問我寞肖,道長(zhǎng),這世上最難降的妖魔是什么衰腌? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任新蟆,我火速辦了婚禮,結(jié)果婚禮上右蕊,老公的妹妹穿的比我還像新娘琼稻。我一直安慰自己,他們只是感情好饶囚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布帕翻。 她就那樣靜靜地躺著,像睡著了一般萝风。 火紅的嫁衣襯著肌膚如雪嘀掸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天规惰,我揣著相機(jī)與錄音睬塌,去河邊找鬼。 笑死歇万,一個(gè)胖子當(dāng)著我的面吹牛揩晴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贪磺,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼硫兰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了寒锚?” 一聲冷哼從身側(cè)響起劫映,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤呻粹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后苏研,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腮郊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年摹蘑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧飞。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衅鹿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出过咬,到底是詐尸還是另有隱情大渤,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布掸绞,位于F島的核電站泵三,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衔掸。R本人自食惡果不足惜烫幕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敞映。 院中可真熱鬧较曼,春花似錦、人聲如沸振愿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冕末。三九已至萍歉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栓霜,已是汗流浹背翠桦。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胳蛮,地道東北人销凑。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像仅炊,于是被迫代替她去往敵國和親斗幼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容