?>
有一点要注意的是,在模型和数据访问类之间,它们的交互从不会多于一行??没有多行被传送,那样会很快使程式慢下来。同样的程式对于使用模式的类,它只需要在内存中保留一行(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; } } ?> |
最后是控制器,我们将把视图实现为一个子类。
<?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(); } }
|