如何实现MVC模式的PHP功能?
例子
这里是一个使用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 <SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #006600;
|
本文地址:
http://www.45fan.com/a/question/67077.html