MVC思想在PHP中的實現思路

我相信已經有不少這樣的文章了,可是我今天仍是願意把本身的經驗與你們分享一下。純屬原創,我也沒什麼保留,但願對新手有幫助,有說的不對的地方,也歡迎指出。php

什麼是MVC?簡單的說就是將網站源碼分類、分層。程序員

MVC三個字母的含義:數據庫

  • M:Model 模型,負責數據庫操做。
  • V:View 視圖,負責調用Model調取數據,再調用模板,展現出最終效果。
  • C:Controller 控制器,程序的入口,決定改調用哪一個View,並告訴View該作什麼。

如此說來,程序的執行順序是C-V-M 或 C-M ,和MVC的名字正好相反。緩存

爲何要MVC?

  1. 能使網站程序物理結構更合理
  2. 當用PHP建設一個網站的時候,最笨的方法,你可能把每一個頁面建成一個PHP文件。若是你的網站只有index.php,menu.php.article.php 三個頁面,那你能夠不用MVC,但咱們作通常的網站的時候,動輒幾十個頁面,把全部頁面放在根目錄顯然不是咱們所能接受的,因而你須要一個合理的思想去將你的代碼分類,按功能把他們分紅不一樣的目錄,且由程序智能的載入調用,這就是MVC要幫助你作的。安全

  3. 使代碼更容易維護
  4. 咱們再來看單個頁面,最笨的方法,就是PHP代碼與HTML代碼混合,這顯然不夠好,你在維護網站的時候不得不區分哪裏是PHP,哪裏是HTML,這對於一個程序員來講,簡直只災難。因而不少人就使用Smarty,這樣就能夠將"數據處理"與"頁面展現"分開來,這樣作的確不錯,也有不少人正在這麼作,但這還不是MVC,MVC要作的就是將"數據處理"再分爲"邏輯處理"與"數據庫操做",這就是所說的分層。框架

    這樣當你的程序錯誤或想要修改的時候,就變得很輕鬆了,當頁面顯示錯誤的時候,你就去檢查V或模板文件;當邏輯有問題的時候,你就去檢查C和V;當你數據庫操做錯誤就去檢查M。其實MVC通常要把PHP的一個頁面分割爲4個頁面,分別是C,V,M,模板。各司其職,方便管理。函數

  5. 有利於代碼複用
  6. MVC會把通常會把一個大的功能放在一個目錄下,也就是由一個C去管理。post

    例如要作一個含有會員系統的網站,咱們就能夠把會員相關的代碼都放到user目錄裏,由User_Controller統一管理,當咱們另外一個網站也須要會員系統的時候,咱們就能夠直接把這個目錄複製過去,修改一下接口就能夠了。網站

PHP實現MVC的思路

咱們須要三個基類:Controller、View、Model ,而後不一樣的C、V、M分別繼承他們就有對應的屬性與方法了,若是這裏你不理解,能夠去看看面向對象的書。設計

我給你們提供一種MVC基類的設計思路,僅供參考:

Controller類的設計

一個main()方法,供程序調用,主要是經過get和post變量決定該如何處理。

一個getModel($model)方法,在須要調用數據庫的時候,調用對應目錄的M。

一個display($view)方法,在main()方法中調用,載入對應的V,並掉應V的main()方法。

View類的設計與Controller很類似

一個main()方法,當C載入V的時候調用這個方法,使程序能繼續執行下去。

一個getModel($model)方法,在須要調用數據庫的時候,調用對應目錄的M。

一個display($template),調用對應的模板文件,並把數據傳遞給模板。

Model類的設計

能夠定義一些屬性,例如要操做那些表,操做那些字段等。

一個getDB()方法,得到一個數據庫類的實例,(數據庫類通常都是用單件模式設計的)

一個load()方法,載入一個數據。

一個add()方法,能夠根據定義好的屬性自動構造SQL語句,並執行插入操做。

一個eidt()方法,同上,但執行修改操做。

一個del()方法,同上,但執行刪除操做。

爲了能使新手更好的理解我這個思路的工做原理,咱們如今模擬一個用戶登陸的場景,看看MVC是如何工做的。

如今假設,全部的數據都提交給index.php。

第一步

咱們提交各get變量,告訴index.php該用哪一個C,例如能夠這樣index.php?controller=user。

而後index接收到get變量,什麼也不須要作,直接找到/user/controller.php,把全部數據丟給他,原本GET和POST就是全局的,因此index.php也不須要作什麼,直接調用C的main函數就能夠了,到此index.php的任務完成。

第二步

C的main函數開始執行,檢查變量,發現用戶要執行的登陸操做(很簡單,你post個變量do=login就能夠了),因而調用getModel,載入對應的M類(例如/user/models/model.php),並實例化, 調用實例的load方法,載入該用戶的數據資料,判斷是否與用戶提交的密碼一致,若是提交的數據不正確header跳轉到出錯頁面,若是正確,調用display()方法,載入對應的V(例如/user/views/details.php),並實例化,調用其main()函數,進入第三步。到此C的任務已完成,第二不操做均在main函數中進行。

第三步

你能夠選擇調用getModel()載入M,重寫調取數據,也能夠在C實例化V的時候,把參數傳過來(例如SESSION),當V已經肯定獲得數據之後,display(),載入模板,MVC執行完畢。

固然,因爲字數與精力限制,這裏寫的只是很是簡要的歸納,實際實施的時候要考慮不少細節,但我設計MVC的時候,大概思路就是這樣,也用到了實際中,感受良好。

網上幾個框架和網上流行的系統,好比phpcms V9 ,wiki,還有一些團購的程序。它們的特色都是一個入口文件,有模型,有控制器,還有視圖。具體的劃分界限也不清楚。全憑感受。不過爲了本身更好的理解,其實MVC一開始不是很容易就被理解的,我想本身構思一下本身的框架。其實原理應該仍是它們。

  1. 第一部分:引導器。也就是框架的入口文件。通常爲根目錄下的index.php,它的功能就相似於BIOS。
  2. 第二部分:數據初始器。這部分的功能就是對客戶端返回來的數據進行初始化和安全處理,爲了方便框架的運行和便利獲取數據,可能會把數據轉變成本身想要的格式。
  3. 第三部分:控制加載器,MVC中有個控制器,這個部分的功能則就是根據初始化數據,進行控制器的導入和加載。
  4. 第四部分就是:控制器,這部分的內容是最關鍵,也是最自由的地方。它經過加載模型,調用更新緩存,處理業務邏輯,加載模板引擎解析,返回頁面。
  5. 第五部分:模板引擎。這個通常會在控制器的結尾(業務邏輯的結尾,不必定是程序的結尾)使用到,模板引擎的好壞,關係到模板的解析速度和模板製做的靈活性。
相關文章
相關標籤/搜索