最后是控制器,我们将把视图实现为一个子类。
<?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文档定义的。
@ 完整程式
PS:本来是一个帖子的;可是死活贴不上来 -________-b 只好腰斩了
Part1 http://www.csdn.net/Develop/read_article.asp?id=21639
Part2 http://www.csdn.net/Develop/read_article.asp?id=21640
Part3 http://www.csdn.net/Develop/read_article.asp?id=21641 
|