日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP MVC模式在網站架構中的實現

瀏覽:25日期:2024-01-12 13:57:56

MVC模式在網站架構中十分常見。它允許我們建立一個三層結構的應用程式,從代碼中分離出有用的層,幫助設計師和開發者協同工作以及提高我們維護和擴展既有程式的能力。

視圖(View)

“視圖”主要指我們送到Web瀏覽器的最終結果??比如我們的腳本生成的HTML。當說到視圖時,很多人想到的是模版,但是把模板方案叫做視圖的正確性是值得懷疑的。

對視圖來說,最重要的事情可能是它應該是“自我意識(self aware)”的,視圖被渲染(render)時,視圖的元素能意識到自己在更大框架中的角色。

以XML為例,可以說XML在被解析時,DOM API有著這樣的認知??一個DOM樹里的節點知道它在哪里和它包含了什么。 (當一個XML文檔中的節點用SAX解析時只有當解析到該節點時它才有意義。)

絕大多數模板方案使用簡單的過程語言和這樣的模板標簽:

<p>{some_text}</p> <p>{some_more_text}</p>

它們在文檔中沒有意義,它們代表的意義只是PHP將用其他的東西來替換它。

如果你同意這種對視圖的松散描述,你也就會同意絕大多數模板方案并沒有有效的分離視圖和模型。模板標簽將被替換成什么存放在模型中。

在你實現視圖時問自己幾個問題:“全體視圖的替換容易嗎?”“實現一個新視圖要多久?” “能很容易的替換視圖的描述語言嗎?(比如在同一個視圖中用SOAP文檔替換HTML文檔)”

模型(Model)

模型代表了程序邏輯。(在企業級程序中經常稱為業務層(business layer))

總的來說,模型的任務是把原有數據轉換成包含某些意義的數據,這些數據將被視圖所顯示。通常,模型將封裝數據查詢,可能通過一些抽象數據類(數據訪問層)來實現查詢。舉例說,你希望計算英國年度降雨量(只是為了給你自己找個好點的度假地),模型將接收十年中每天的降雨量,計算出平均值,再傳遞給視圖。

控制器(controller)

簡單的說控制器是Web應用中進入的HTTP請求最先調用的一部分。它檢查收到的請求,比如一些GET變量,做出合適的反饋。在寫出你的第一個控制器之前,你很難開始編寫其他的PHP代碼。最常見的用法是index.php中像switch語句的結構:

<?php switch ($_GET['viewpage']) { case 'news': $page=new NewsRenderer; break; case 'links': $page=new LinksRenderer; break; default: $page=new HomePageRenderer; break; } $page->display(); ?>

這段代碼混用了面向過程和對象的代碼,但是對于小的站點來說,這通常是最好的選擇。雖然上邊的代碼還可以優化。

控制器實際上是用來觸發模型的數據和視圖元素之間的綁定的控件。

例子

這里是一個使用MVC模式的簡單例子。

首先我們需要一個數據庫訪問類,它是一個普通類。

<?php /** *; A simple class for querying MySQL */ class DataAccess { /** * Private * $db stores a database resource */ var $db; /** * Private * $query stores a query resource */ var $query; // Query resource

//! A constructor. /** * Constucts a new DataAccess object * @param $host string hostname for dbserver * @param $user string dbserver user * @param $pass string dbserver user password * @param $db string database name */ function DataAccess ($host,$user,$pass,$db) { $this->db=mysql_pconnect($host,$user,$pass); mysql_select_db($db,$this->db); }

//! An accessor /** * Fetches a query resources and stores it in a local member * @param $sql string the database query to run * @return void */ function fetch($sql) { $this->query=mysql_unbuffered_query($sql,$this->db); // Perform query here }

//! An accessor /** * Returns an associative array of a query row * @return mixed */ function getRow () { if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) ) return $row; else return false; } } ?>

在它上邊放上模型。

<?php /** *; Fetches 'products' from the database */ class ProductModel { /** * Private * $dao an instance of the DataAccess class */ var $dao;

//! A constructor. /** * Constucts a new ProductModel object * @param $dbobject an instance of the DataAccess class */ function ProductModel (&$dao) { $this->dao=& $dao; }

//! A manipulator /** * Tells the $dboject to store this query as a resource * @param $start the row to start from * @param $rows the number of rows to fetch * @return void */ function listProducts($start=1,$rows=50) { $this->dao->fetch('SELECT * FROM products LIMIT '.$start.', '.$rows); }

//! A manipulator /** * Tells the $dboject to store this query as a resource * @param $id a primary key for a row * @return void */ function listProduct($id) { $this->dao->fetch('SELECT * FROM products WHERE PRODUCTID=''.$id.'''); }

//! A manipulator /** * Fetches a product as an associative array from the $dbobject * @return mixed */ function getProduct() { if ( $product=$this->dao->getRow() ) return $product; else return false; } } ?>

有一點要注意的是,在模型和數據訪問類之間,它們的交互從不會多于一行??沒有多行被傳送,那樣會很快使程式慢下來。同樣的程式對于使用模式的類,它只需要在內存中保留一行(Row)??其他的交給已保存的查詢資源(query resource)??換句話說,我們讓MYSQL替我們保持結果。

接下來是視圖??我去掉了HTML以節省空間,你可以查看這篇文章的完整代碼。

<?php /** *; Binds product data to HTML rendering */ class ProductView { /** * Private * $model an instance of the ProductModel class */ var $model;

/** * Private * $output rendered HTML is stored here for display */ var $output;

//! A constructor. /** * Constucts a new ProductView object * @param $model an instance of the ProductModel class */ function ProductView (&$model) { $this->model=& $model; }

//! A manipulator /** * Builds the top of an HTML page * @return void */ function header () {

}

//! A manipulator /** * Builds the bottom of an HTML page * @return void */ function footer () {

}

//! A manipulator /** * Displays a single product * @return void */ function productItem($id=1) { $this->model->listProduct($id); while ( $product=$this->model->getProduct() ) { // Bind data to HTML } }

//! A manipulator /** * Builds a product table * @return void */ function productTable($rownum=1) { $rowsperpage='20'; $this->model->listProducts($rownum,$rowsperpage); while ( $product=$this->model->getProduct() ) { // Bind data to HTML } }

//! An accessor /** * Returns the rendered HTML * @return string */ function display () { return $this->output; } } ?>

摘要:MVC模式在網站架構中十分常見。它允許我們建立一個三層結構的應用程式,從代碼中分離出有用的層,幫助設計師和開發者協同工作以及提高我們維護和擴展既有程式的能力。本文將向您介紹MVC模式在PHP中的實現。標簽:PHP MVC; MVC模式; PHP網站Oracle幫您準確洞察各個物流環節Oracle幫您準確洞察各個物流環節最后是控制器,我們將把視圖實現為一個子類。

<?php /** *; Controls the application */ class ProductController extends ProductView {

//! A constructor. /** * Constucts a new ProductController object * @param $model an instance of the ProductModel class * @param $getvars the incoming HTTP GET method variables */ function ProductController (&$model,$getvars=null) { ProductView::ProductView($model); $this->header(); switch ( $getvars['view'] ) { case 'product': $this->productItem($getvars['id']); break; default: if ( empty ($getvars['rownum']) ) { $this->productTable(); } else { $this->productTable($getvars['rownum']); } break; } $this->footer(); } } ?>

注意這不是實現MVC的唯一方式??比如你可以用控制器實現模型同時整合視圖。這只是演示模式的一種方法。

我們的index.php 文件看起來像這樣:

<?php require_once('lib/DataAccess.php'); require_once('lib/ProductModel.php'); require_once('lib/ProductView.php'); require_once('lib/ProductController.php');

$dao=& new DataAccess ('localhost','user','pass','dbname'); $productModel=& new ProductModel($dao); $productController=& new ProductController($productModel,$_GET); echo $productController->display(); ?>

漂亮而簡單。

我們有一些使用控制器的技巧,在PHP中你可以這樣做:

$this->{$_GET['method']}($_GET['param']);

一個建議是你最好定義程序URL的名字空間形式(namespace),那樣它會比較規范比如:

'index.php?class=ProductView&method=productItem&id=4'

通過它我們可以這樣處理我們的控制器:

$view=new $_GET['class']; $view->{$_GET['method']($_GET['id']);

有時候,建立控制器是件很困難的事情,比如當你在開發速度和適應性之間權衡時。一個獲得靈感的好去處是Apache group 的Java Struts,它的控制器完全是由XML文檔定義的。

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲v在线看| 亚洲深深色噜噜狠狠爱网站| 国产精品15p| 老鸭窝一区二区久久精品| 国模精品一区| 国产成人精品一区二区三区免费| 免费高潮视频95在线观看网站| 欧美日韩亚洲在线观看| 亚洲制服少妇| 精品一区二区三区中文字幕| 亚洲一级少妇| 国产一级久久| 欧美日韩亚洲国产精品| 国产精品丝袜在线播放| 色乱码一区二区三区网站| 日韩久久一区二区三区| 欧美日韩视频| 热三久草你在线| a国产在线视频| 久久蜜桃精品| 91精品福利| 国产精品麻豆成人av电影艾秋| 日本国产欧美| 日韩精品dvd| 午夜av一区| 国产精品一二| 精品欧美久久| 国产精品欧美一区二区三区不卡| 日韩av影院| 你懂的国产精品永久在线| 国产不卡人人| 激情欧美亚洲| 奇米色欧美一区二区三区| 麻豆视频久久| 久久麻豆精品| 亚洲激情二区| 青草综合视频| 91精品韩国| 亚洲日本在线观看视频| 天堂网av成人| 91精品国产调教在线观看| 欧美成a人免费观看久久| 欧美精选视频一区二区| 国产亚洲一级| 日韩欧美另类中文字幕| 午夜精品影视国产一区在线麻豆| 美女视频网站久久| 久久精品高清| 亚洲精品日本| 精品久久久久中文字幕小说| 欧美xxxx中国| 国产农村妇女精品一区二区| 欧美日韩调教| 久久久一本精品| 天堂俺去俺来也www久久婷婷| 精品视频97| 亚洲一区观看| 国产欧美精品| 欧美二区视频| 国产精品白丝一区二区三区| 九九综合在线| 国产精品久久久久9999高清| 91精品国产成人观看| 日韩欧美在线精品| 欧美日韩免费观看视频| 久久久蜜桃一区二区人| 免费日本视频一区| 国产乱码午夜在线视频| 蜜臀va亚洲va欧美va天堂| 成人在线视频中文字幕| 老鸭窝亚洲一区二区三区| 美女视频黄久久| 亚洲一区国产| 手机在线电影一区| 欧美一区成人| 一区在线观看| 精品深夜福利视频| 日本色综合中文字幕| 欧美aa在线观看| 国产午夜一区| 伊人精品视频| 91视频精品| 97久久亚洲| 尤物网精品视频| 国产成人久久精品一区二区三区| 中文字幕av一区二区三区人| 国产美女高潮在线观看| 日韩欧美久久| 亚洲成人三区| 97精品97| 国产精品多人| 日韩精品免费一区二区夜夜嗨| 性欧美xxxx免费岛国不卡电影| 国产欧美日韩在线观看视频| 香蕉久久国产| 国产综合色区在线观看| 国产精品日韩精品中文字幕| 亚洲欧美日韩国产综合精品二区 | 国产精一区二区| 视频一区二区不卡| 国产一区观看| 高潮久久久久久久久久久久久久| 日韩福利视频导航| 在线一区二区三区视频| 欧美手机在线| 亚洲v在线看| 精品美女在线视频| 国产午夜久久av| 欧美伊人久久| 91精品美女| 日本不卡一二三区黄网| 亚洲天堂免费| 噜噜噜久久亚洲精品国产品小说| 久久青青视频| 国产精品久久久久蜜臀| 精品中文字幕一区二区三区| 久久精品av麻豆的观看方式| 四虎国产精品免费久久| 免费美女久久99| 在线亚洲自拍| 99国产精品| 欧美精品羞羞答答| 亚洲手机在线| 欧美理论视频| 午夜国产一区二区| 国产精品美女久久久| 黄色在线一区| 久久午夜影视| 亚洲精品美女91| 欧美国产先锋| 国产一区国产二区国产三区| 国语精品一区| 国产精品成久久久久| 国产+成+人+亚洲欧洲在线| 精品免费av一区二区三区| 日本激情一区| 麻豆国产在线| 久久国产欧美| 亚洲香蕉网站| 中日韩男男gay无套| 九一成人免费视频| 亚洲欧美日韩一区在线观看| 亚洲免费影院| 日本一区二区三区视频在线看| 国产精品视频一区二区三区综合| 久久亚洲人体| 五月激情久久| 欧美午夜不卡| 一区二区国产在线观看| 欧美天堂一区二区| 精品72久久久久中文字幕| 国产96在线亚洲| 激情久久婷婷| 亚洲日本免费电影| 国产欧美一区二区三区米奇| 狠狠久久伊人| 激情欧美一区二区三区| 亚洲一级淫片| 精品丝袜久久| 日韩精品久久久久久久电影99爱| av中文字幕在线观看第一页 | 国产亚洲久久| 精品中国亚洲| 国产一区不卡| 超级白嫩亚洲国产第一| 久久久久99| 丝袜国产日韩另类美女| 国产精品主播| 欧美日韩一区二区三区不卡视频 | 国产精品呻吟| 欧美综合社区国产| 日韩精品不卡一区二区| 在线看片不卡| 69堂免费精品视频在线播放| 水蜜桃精品av一区二区| 国产亚洲一区在线| 日韩中文字幕一区二区高清99| 国产欧美另类| 久久免费高清| 在线免费观看亚洲| 欧美a在线观看| 蜜桃成人av| 欧美日韩夜夜| 亚洲啊v在线| 综合激情网...| 97在线精品| 国产精品腿扒开做爽爽爽挤奶网站| 国产精品极品国产中出| 婷婷色综合网| 国产精品66| 亚洲一区欧美激情| 国产情侣久久| 欧美亚洲国产激情| 国产日韩免费| 欧美日韩国产欧| 久久精品一区二区国产| 亚洲综合三区| 国产网站在线| 日本精品另类| 国产综合亚洲精品一区二|