控制器实际上是用来触发模型的数据和视图元素之间的绑定的控件。
例子
这里是一个使用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替我们保持结果。