什麼是MVC?
關於MVC的定義和解釋,能夠說多種多樣。咱們能夠在Wiki或者[2]中找到更爲詳盡的解釋,這裏我並不打算,也沒有能力進行深刻的講解,從PHP開發的角度來說,MVC能夠歸納爲:
視圖(The View):
一說到視圖,咱們不少人都會想到模板引擎(諸如Smarty等等)。其實就是各類各樣的輸出,好比說html模板和Javascript文件等。
模塊(The Model)
模塊表明了程序的邏輯,在企業應用中一般稱爲業務邏輯層。通常來說,這一層完成的工做是把原始的數據處理成按照咱們設計的數據結構存儲的有意義的數據序列,並將這些數據交給視圖去處理。一般狀況下, 模塊中會利用一個數據抽象類來進行與數據操做有關的處理。
Model一般包含了哪些用來同數據庫打交道的函數。
控制器(The Controller)
控制器使全部WEB應用的第一站,他接受收到的參數,好比$_GET變量,而後作出相應的反應。
關於MVC的是否適合PHP的爭論也不少,人們不斷的討論MVC是否適合PHP[3],如今也已經有了不少的MVC框架,諸如PHP MVC Frameworks中列出的[4]。那麼,爲何人們這麼熱衷於MVC,咱們爲何要使用MVC在咱們的設計中呢。
爲何用MVC?
MVC最先是用來解決桌面GUI的編程問題,最先的MVC框架應該是Sun在1999年提出的Model 2,後來演變成了Struts。MVC帶給人們深入的印象,可是咱們在使用的過程當中,卻並無認真的想過爲何使用MVC。
在傳統的桌面應用中,一旦Model中有時間發生,咱們能夠主動的讓View界面進行刷新,從而展現後臺發生的變化。而在Web應用中,咱們彷佛限於傳統的Http的Request/Response的方式,咱們彷佛沒有辦法讓用戶端進行更新。這一段討論,並非認爲MVC不可以用來進行WEB應用的開發,而是以爲從某種程度上來講,他還不是最合適的。
關於使用MVC的爭論還有不少[1],可是相信全部習慣了使用MVC來組織本身的項目的人,讓他選擇一個新的項目構架時,必定不會放棄MVC。
如何實現MVC?
下面是一個超級簡單的MVC結構實現,甚至連數據源都用了一個內置的固定數組,雖然簡單,但其實衆多的PHP Framework核心實現的思想應該和這個是差很少的,只不過一些framework提供了更多的方便開發者使用的工具,我也想本身來實現一個PHP的框架,目前正在着手策劃中,也但願本身可以從框架的開發中學習到更多的PHP設計思想和方法。php
Controller.phphtml
include 'Model.php'; include 'View.php'; class Controller { private $model = ''; private $view = ''; public function Controller(){ $this->model = new Model(); $this->view = new View(); } public function doAction( $method = 'defaultMethod', $params = array() ){ if( empty($method) ){ $this->defaultMethod(); }else if( method_exists($this, $method) ){ call_user_func(array($this, $method), $params); }else{ $this->nonexisting_method(); } } public function link_page($name = ''){ $links = $this->model->getLinks(); $this->view->display($links); $result = $this->model->getResult($name); $this->view->display($result); } public function defaultMethod(){ $this->br(); echo "This is the default method. "; } public function nonexisting_method(){ $this->br(); echo "This is the noexisting method. "; } public function br(){ echo "<br />"; } } $controller = new Controller(); $controller->doAction('link_page', 'b'); $controller->doAction();
Model.phpnode
class Model { private $database = array( "a" => "hello world", "b" => "ok well done", "c" => "good bye", ); //@TODO connect the database //run the query and get the result public function getResult($name){ if( empty($name) ){ return FALSE; } if( in_array($name, array_keys( $this->database ) ) ){ return $this->database[$name]; } } public function getLinks(){ $links = "<a href='#'>Link A</a> "; $links.= "<a href='#'>Link B</a> "; $links.= "<a href='#'>Link C</a> "; return $links; } }
View.phpweb
class View { public function display($output){ // ob_start(); echo $output; } }
參考資料:
一、MVC and Web apps http://www.sitepoint.com/blogs/2005/12/22/mvc-and-web-apps-oil-and-water/
二、Model View Controller http://www.phpwact.org/pattern/model_view_controller
三、Is MVC over designed Crap http://phplens.com/phpeverywhere/?q=node/view/143
四、PHP MVC Framworks http://www.phpwact.org/php/mvc_frameworks
五、Model 2 http://en.wikipedia.org/wiki/Model_2
六、Stupid Easy MVC http://codesnipers.com/?q=node/158&&title=Stupidly-Easy-MVC-in-PHP-or-數據庫