用最簡潔的代碼構建MVC分層

首先來看MVC的關係圖:



我共要建立五個文件:
index.php
DataAccess.php            數據庫類
ProductModel.php        模型的實現
ProductController.php  控制器的實現
ProductView.php          視圖的實現


index.php
  1. <?php
  2. require_once('lib/DataAccess.php');
  3. require_once('lib/ProductModel.php');
  4. require_once('lib/ProductView.php');
  5. require_once('lib/ProductController.php');
  6. $dao = new DataAccess ('localhost','user','pass','dbname');
  7. $productModel = new ProductModel($dao);
  8. $productController = new ProductController($productModel,$_GET);
  9. echo $productController->display();
  10. ?>
複製代碼
首先咱們包含全部文件, 建立數據庫對象,而後用他做爲參數建立模型對象,而後用模型對象建立控制器對象,再調用控制器的方法輸出打印,這裏控制器繼承了視圖類.


DataAccess.php 

  1. <?php
  2. class DataAccess {
  3.     private $db;
  4.     private $query; 
  5.     public function DataAccess ($host,$user,$pass,$db) {
  6.         $this->db=mysql_pconnect($host,$user,$pass);
  7.         mysql_select_db($db,$this->db);
  8.     }
  9.     public function fetch($sql) {
  10.         $this->query=mysql_unbuffered_query($sql,$this->db); 
  11.     }
  12.     public function getRow () {
  13.         if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
  14.             return $row;
  15.         else
  16.             return false;
  17.     }
  18. }
  19. ?>
複製代碼

這是一個簡單的數據庫類.很容易理解.


模型 -- ProductModel.php
  1. <?php
  2. class ProductModel {
  3.     private $dao;
  4.     public function ProductModel ($dao) {
  5.         $this->dao = $dao;
  6.     }
  7.     public function listProducts($start=1, $rows=50) {
  8.         $this->dao->fetch("SELECT * FROM products LIMIT ".$start.", ".$rows);
  9.     }
  10.     public function listProduct($id) {
  11.         $this->dao->fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'");
  12.     }
  13.     public function getProduct() {
  14.         if ( $product=$this->dao->getRow() )
  15.             return $product;
  16.         else
  17.             return false;
  18.     }
  19. }
  20. ?>
複製代碼

模型中已經封裝了獲取數據的不一樣方法,這正是他的職責所在:企業數據和業務規則. 上海性病醫院 模型擁有最多的處理任務.

視圖 -- ProductView.php

  1. <?php
  2. class ProductView {
  3.     private $model;
  4.     private $output;
  5.     public function ProductView ($model) {
  6.         $this->model= $model;
  7.     }
  8.     public function header () {
  9.         $this->output=<<<EOD
  10. <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
  11. <html>
  12. <head>
  13. <title> Our Products </title>
  14. <style>
  15. body { font-size: 13.75px; font-family: verdana }
  16. td { font-size: 13.75px; font-family: verdana }
  17. .title { font-size: 15.75px; font-weight: bold; font-family: verdana }
  18. .heading {
  19.     font-size: 13.75px; font-weight: bold;
  20.     font-family: verdana; ">
  21. .nav { ">
  22. </style>
  23. </head>
  24. <body>
  25. <div align="center" class="title">Our Products</div>
  26. EOD;
  27.         $this->output.="\n<div align=\"right\"><a href=\"".
  28.             $_SERVER['PHP_SELF']."\">Start Over</a></div>\n";
  29.     }
  30.     public function footer () {
  31.         $this->output.="</body>\n</html>";
  32.     }
  33.     public function productItem($id=1) {
  34.         $this->model->listProduct($id);
  35.         while ( $product=$this->model->getProduct() ) {
  36.             $this->output.="<p><b>Name</b>:".$product['PRODUCTNAME']."</p>".
  37.                 "<p><b>Price</b>:".$product['UNITPRICE']."</p>".
  38.                 "<p><b># In Stock</b>:".$product['UNITSINSTOCK']."</p>";
  39.             if ( $this->$product['DISCONTINUED']==1 ) {
  40.                 $this->output.="<p>This product has been discontinued.</p>";
  41.             }
  42.         }
  43.     }
  44.     public function productTable($rownum=1) {
  45.         $rowsperpage='20';
  46.         $this->model->listProducts($rownum,$rowsperpage);
  47.         $this->output.="<table width=\"600\" align=\"center\">\n<tr>\n".
  48.                 "<td class=\"heading\">Name</td>\n".
  49.                 "<td class=\"heading\">Price</td>\n</tr>\n";
  50.         while ( $product=$this->model->getProduct() ) {
  51.             $this->output.="<tr>\n<td><a href=\"".$_SERVER['PHP_SELF'].
  52.                 "?view=product&id=".$product['PRODUCTID']."\">".
  53.                 $product['PRODUCTNAME']."</a></td>".
  54.                 "<td>".$product['UNITPRICE']."</td>\n</tr>\n";
  55.         }
  56.         $this->output.="<tr class=\"nav\">\n";
  57.         if ( $rownum!=0 && $rownum > $rowsperpage ) {
  58.             $this->output.="<td><a href=\"".$_SERVER['PHP_SELF'].
  59.                 "?view=table&rownum=".($rownum-$rowsperpage).
  60.                 "\"><< Prev</a></td>";
  61.         } else {
  62.             $this->output.="<td> </td>";            
  63.         }
  64.         if ( $product['PRODUCTID'] < ($rownum + $rowsperpage) ) {
  65.             $this->output.="<td><a href=\"".$_SERVER['PHP_SELF'].
  66.                 "?view=table&rownum=".($rownum+$rowsperpage).
  67.                 "\">Next >></a></td>";
  68.         } else {
  69.             $this->output.="<td> </td>\n";            
  70.         }
  71.         $this->output.="</tr>\n</table>\n";
  72.     }
  73.     public function display () {
  74.         return $this->output;
  75.     }
  76. }
  77. ?>
複製代碼

也許咱們應該先講控制器,可是控制器是繼承了視圖,能夠先看一下這段代碼而後立刻看下面的控制器,就很好理解了 上海人乳頭瘤病毒醫院
這裏的視圖提供了模型引用句柄,封裝了展現所需的模塊:head(), foot(),以及提供給控制器來實現多態控制的一系列方法.最後還有個打印的調用方法.
雖然這裏沒有與用戶交互的功能,但已經爲應用程序處理了不一樣的視圖.


控制器 -- ProductController.php
  1. <?php
  2. class ProductController extends ProductView {
  3.     public function ProductController ($model,$getvars=null) {
  4.         ProductView::ProductView($model);
  5.         $this->header();
  6.         switch ( $getvars['view'] ) {
  7.             case "product":
  8.                 $this->productItem($getvars['id']);
  9.                 break;
  10.             default:
  11.                 if ( empty ($getvars['rownum']) ) {
  12.                     $this->productTable();
  13.                 } else {
  14.                     $this->productTable($getvars['rownum']);
  15.                 }
  16.                 break;
  17.         }
  18.         $this->footer();
  19.     }
  20. }
  21. ?>
複製代碼

其實控制器主要實現的就是多態性.
相關文章
相關標籤/搜索