电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

PHP MVC模式在網(wǎng)站架構(gòu)中的實(shí)現(xiàn)

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

MVC模式在網(wǎng)站架構(gòu)中十分常見。它允許我們建立一個(gè)三層結(jié)構(gòu)的應(yīng)用程式,從代碼中分離出有用的層,幫助設(shè)計(jì)師和開發(fā)者協(xié)同工作以及提高我們維護(hù)和擴(kuò)展既有程式的能力。

視圖(View)

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

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

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

絕大多數(shù)模板方案使用簡單的過程語言和這樣的模板標(biāo)簽:

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

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

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

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

模型(Model)

模型代表了程序邏輯。(在企業(yè)級程序中經(jīng)常稱為業(yè)務(wù)層(business layer))

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

控制器(controller)

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

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

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

控制器實(shí)際上是用來觸發(fā)模型的數(shù)據(jù)和視圖元素之間的綁定的控件。

例子

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

首先我們需要一個(gè)數(shù)據(jù)庫訪問類,它是一個(gè)普通類。

<?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; } } ?>

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

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

<?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模式在網(wǎng)站架構(gòu)中十分常見。它允許我們建立一個(gè)三層結(jié)構(gòu)的應(yīng)用程式,從代碼中分離出有用的層,幫助設(shè)計(jì)師和開發(fā)者協(xié)同工作以及提高我們維護(hù)和擴(kuò)展既有程式的能力。本文將向您介紹MVC模式在PHP中的實(shí)現(xiàn)。標(biāo)簽:PHP MVC; MVC模式; PHP網(wǎng)站Oracle幫您準(zhǔn)確洞察各個(gè)物流環(huán)節(jié)Oracle幫您準(zhǔn)確洞察各個(gè)物流環(huán)節(jié)最后是控制器,我們將把視圖實(shí)現(xiàn)為一個(gè)子類。

<?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(); } } ?>

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

我們的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']);

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

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

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

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

有時(shí)候,建立控制器是件很困難的事情,比如當(dāng)你在開發(fā)速度和適應(yīng)性之間權(quán)衡時(shí)。一個(gè)獲得靈感的好去處是Apache group 的Java Struts,它的控制器完全是由XML文檔定義的。

標(biāo)簽: PHP
主站蜘蛛池模板: 恒温水槽与水浴锅-上海熙浩实业有限公司 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 土壤肥料养分速测仪_测土配方施肥仪_土壤养分检测仪-杭州鸣辉科技有限公司 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 上海诺狮景观规划设计有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 据信,上课带着跳 D 体验-别样的课堂刺激感受引发网友热议 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 微量水分测定仪_厂家_卡尔费休微量水分测定仪-淄博库仑 | 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 萃取箱-萃取槽-PVC萃取箱厂家-混合澄清槽- 杭州南方化工设备 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 焦作网 WWW.JZRB.COM| 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 球盟会·(中国)官方网站 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | 科普仪器菏泽市教育教学仪器总厂 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 单螺旋速冻机-双螺旋-流态化-隧道式-食品速冻机厂家-广州冰泉制冷 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 论文查重_免费论文查重_知网学术不端论文查重检测系统入口_论文查重软件 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 集菌仪厂家_全封闭_封闭式_智能智能集菌仪厂家-上海郓曹 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 设计圈 - 让设计更有价值!| 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 |