最后是控制器,我们将把视图实现为一个子类。
<?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