最后是控制器,我们将把视图实现为一个子类。
<?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 文档定义的。
@ 完整程式