MVC模式是"Model-View-Controller"的縮寫,中文翻譯為"模式-視圖-控制器"。MVC應用程式總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要Controller改變了Models的資料或者屬性,所有依賴的View都會自動更新。類似的,只要Controller改變了View,View會從潛在的Model中擷取資料來重新整理自己。MVC模式最早是smalltalk語言研究團提出的,應用於使用者互動應用程式中。smalltalk語言和java語言有很多相似性,都是物件導向語言,很自然的SUN在petstore(寵物店)案例應用程式中就推薦MVC模式作為開發Web應用的架構模式。MVC模式是一種架構模式,其實需要其他模式協作完成。在J2EE模式目錄中,通常採用service to worker模式實現,而service to worker模式可由集中控制器模式,派遣器模式和Page Helper模式組成。而Struts只實現了MVC的View和Controller兩個部分,Model部分需要開發人員自己來實現,Struts提供了抽象類別Action使開發人員能將Model應用於Struts架構中Model是代表組件狀態和低級行為的部分,它管理著自己的狀態並且處理所有對狀態的操作,model自己本身並不知道使用自己的view和controller是誰,系統維護著它和view之間的關係,當model發生了改變系統還負責通知相應的view。
View代表了管理model所含有的資料的一個視覺上的呈現。一個Model可以有一個以上的View,但是Swing中卻很少有這樣的情況。
Controller管理著model和使用者之間的互動的控制。它提供了一些方法去處理當model的狀態發生了變化時的情況。
php中的MVC模式運用
首先我來舉個例子:
一個簡單的文章顯示系統
簡單期間,我們假定這個文章系統是唯讀,也就是說這個例子將不涉及文章的發布,現在開始了。
由於只涉及資料庫的讀取,所以我定義了兩個interface
Interface DataOperation { public function select($info); public function selectNum($info); }
上面這interface定義了讀取資料的介面,select方法將返回所需要的文章。selectNum方法返迴文章的總數,這是分頁顯示時用到的。$info是一個數組,用來存放查詢條件
Interface DataSource { public static function getInstance(); }
這裡我們假定我們操作的是資料庫,DataSource定義一個介面,所有實現該介面的執行個體類將得到一個靜態對象
Interface Controller { public function pop(); public function push(); public function execute(); } Interface View { public function display(); }
好了,我們來實現.
下面定義一個類來實現DataSource介面,這個類運用了單例模式
class DataBaseSource implements DataSource { public static $instance = null; public static function getInstance() { if(self::$instance == null) { self::$instance == new PDO("mysql:host=localhost;dbname=article","root","123456"); } return self::$instance; } }
定義一個抽象類別來實現DataOperation,我們要共用一個資料庫連接,所以我在抽象類別中將這個資料庫物件初始化,這樣,所有的子類都能共用這個對象
abstract class DataBaseOperation implements DataOperation { protected $db = null; public function construct() { $this->db = DataBaseSource::getInstance(); } public function select($info); }
下面我來寫一個業務子類來實現抽象類別DataBaseOperation
class Tech extends DataBaseOperation { public function select($info) { //在這裡實現你的代碼 } public function selectNum($info) { //在這裡實現你的代碼 } }
商務邏輯層我們實現了,下面是控制層
class ViewController implements Controller { private $mod = array(); public function push($key,$value); { //實現你的代碼,將類註冊進$this->mod; } public function pop($key) { //實現你的代碼,將$this->mod[$key]值為null; } public function execute($key) { //在這裡實現你的代碼,產生執行個體.注意利用php5新的特性,異常的處理 } }
好了,下面是表現層,這裡將實現Interface View
abstract ArticleView implements View { protected $smarty = null; public function construct() { $this->smarty = new Smarty(); ///下面你可以定義smarty的一些屬性值 } }
具體的頁面,例如科技文章的顯示頁面
class TechArticleView extends ArticleView { public function display() { //實現你的代碼,調用Tech類和更多的DataBaseOperation子類 } }
好了,下面是總入口 index.php
try { $viewController = new ViewController(); $viewController->push("tech",TechArticleView); //持續的增加 $mod = $_GET["mod"]:$_GET["mod"]:$_POST["mod"]; //最後 $viewController->execute($key); } catch(Exception $e) { //如何處理異常就是你的事了 }