原文 http://jcodecraeer.com/a/phpjiaocheng/2012/0305/10.html
这个小程序一共包含6个文件,其中index.php是程序入口、post.htm是留言表单、在lib文件夹里Model、View
、Controller三个文件分别实现MVC,DataAccess是一个简单的数据库访问类。其实这个程序是国外的一个人写的。
PHP代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<?php
class DataAccess {
var $db;
var $query;
function __construct($host,$user,$pass,$db) {
$ this ->db=mysql_pconnect($host,$user,$pass);
mysql_select_db($db,$ this ->db);
}
function fetch($sql) {
$ this ->query=mysql_unbuffered_query($sql,$ this ->db);
}
function getRow () {
if ( $row=mysql_fetch_array($ this ->query,MYSQL_ASSOC) )
return $row;
else
return false ;
}
}
?>
|
下面再来介绍一下Model类。
这个类也很简单,里面的函数一看就知道,是针对各种数据操作的,它通过DataAccess访问数据库。
PHP代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<?php
class Model {
var $dao;
function __construct(&$dao) {
$ this ->dao=$dao;
}
function listNote() {
$ this ->dao->fetch( "SELECT * FROM note" );
}
function postNote($name,$content) {
$sql = "INSERT INTO `test`.`note`
(`id`, `name`, `content`, `ndate`, `add`)
VALUES (NULL, '$name', '$content', NULL, NULL);" ;
$ this ->dao->fetch($sql);
}
function deleteNote($id) {
$sql = "DELETE FROM `test`.`note` WHERE `id`=$id;" ;
$ this ->dao->fetch($sql);
}
function getNote() {
if ( $note=$ this ->dao->getRow() )
return $note;
else
return false ;
}
}
?>
|
看完这两个类之后你可能会发现这与以前我们写程序差不多,的确现在还闻不到MVC的味道,如果你不懂MVC,在这两个类的基础上你完全可以开始写你以前的程序了。例如要显示全部留言,只需要写入下代码:
PHP代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
require_once( 'lib/DataAccess.php' );
require_once( 'lib/Model.php' );
$dao=& new DataAccess ( 'localhost' , 'root' , '' , 'test' );
$model=& new Model($dao);
$model->listNote();
while ($note=$model->getNote())
{
$output.= "姓名:$note[name]<br> 留言:<br> $note[content] <br> <hr />" ;
}
echo $output;
?>
|
很亲切吧,呵呵。
有了这个“感情基础”你就不会对MVC望而生畏了,下面我们就要上今天的主菜了,那就是“Controller”闪亮登场!
先大体浏览一下主要结构,它包括一个Controller类以及派生出的三个子类(listController对应显示留言功能、postController对应发表留言功能以及deleteController对应删除留言功能)。
PHP代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<?php
class Controller {
var $model;
var $view;
function __construct (& $dao) {
$ this ->model=& new Model($dao);
}
function getView() {
return $ this ->view;
}
}
class listController extends Controller{
function __construct (& $dao) {
parent::__construct($dao);
$ this ->view=& new listView($ this ->model);
}
}
class postController extends Controller{
function __construct (& $dao, $post) {
parent::__construct($dao);
$ this ->view=& new postView($ this ->model, $post);
}
}
class deleteController extends Controller{
function __construct (& $dao, $id) {
parent::__construct($dao);
$ this ->view=& new deleteView($ this ->model, $id);
}
}
?>
|
大体浏览之后,你一定打算开始仔细研究它了吧,别急,为了心中有数,我们先从宏观着眼,
先看看总入口index.php是如何调用Controller的:
PHP代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
<html>
<head>
<meta http-equiv= "Content-Type" content= "text/html; charset=gb2312" />
<title>PHP MVC留言板</title>
</head>
<body>
<a href= "post.htm" >添加新留言</a><br>
<p>
<?
php
require_once( 'lib/DataAccess.php' );
require_once( 'lib/Model.php' );
require_once( 'lib/View.php' );
require_once( 'lib/Controller.php' );
$dao=& new DataAccess ( 'localhost' , 'root' , '' , 'test' );
$action=$_GET[ "action" ];
switch (
$action)
{
case "post" :
$controller=& new postController($dao,$_POST); break ;
case "list" :
$controller=& new listController($dao); break ;
case "delete" :
$controller=& new deleteController($dao,$_GET[ "id" ]); break ;
default :
$controller=& new listController($dao); break ;
}
$view=$controller->getView();
$view->display();
?>
</body>
</html>
|
看过index.php之后你就更清楚了吧,原来功能是通过$_GET[“action”]指定的,由一个switch结构分发,不同的功能对应不
同的Controller子类。现在可以滚上去(滚动页面上去的简称,绝非不洁用语^_^)仔细看看这个Controller代码了。注释应该很细了,不
懂的地方就去看看PHP5的OOP语法和概念吧,单纯看这些概念总是越看催眠效果越好,现在带着实际问题去看,应该有所不同吧。不过我还是建议你在完成这
个MVC的Hello World知道MVC是怎么回事之后下功夫打好OOP的基础,毕竟那是根本啊。
怎么样,Controller真是个光说
不练的家伙吧,看不到三行它就把你引向View了,那就看看View吧。
View里有对应的子类,负责相应功能的显示。理解了
Controller,View的代码就不难看了,难看的话也是因为混杂着HTML的原因,它所做的就是从Model获取所需的数据,然后塞到HTML 中。
PHP代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
<?php
class View {
var
$model;
var $output;
function __construct (&$model) {
$ this ->model=$model;
}
function
display() {
echo($ this ->output);
}
}
class
listView extends View
{
function __construct(&$model)
{
parent::__construct(&$model);
$ this ->model->listNote();
while ($note=$ this ->model->getNote())
{
$ this ->output.= "姓名:$note[name]<br> 留 言:<br> $note[content]
<a href=\"" .$_SERVER[ 'PHP_SELF' ]. "?action=delete& amp;id=$note[id]\">删除</a><br> <hr />" ;
}
}
}
class
postView extends View
{
function __construct(&$model, $post)
{
parent::__construct(&$model);
$ this ->model->postNote($post[name],$post[content]);
$ this ->output= "Note Post OK!<br><a href=\"" .$_SERVER[ 'PHP_SELF' ]. "?action=list\">查看</a>" ;
}
}
class
deleteView extends View
{
function __construct(&$model, $id)
{
parent::__construct(&$model);
$ this ->model->deleteNote($id);
$ this ->output= "Note Delete OK!<br><a href=\"" .$_SERVER[ 'PHP_SELF' ]. "?action=list\">查看</a>" ;
}
}
?>
|
之所以UI方面写得如此简陋,是因为这些工作可以交给Smarty这样的模板去做,而我们这里就像集中精力研究MVC,不想把Smarty扯进来,
所以就这样凑合了,以后我们可以再把Smarty结合进来。
看了这个东西之后不知你是否对MVC的概念和实现更明白了一点。
我也是个初学
者,这是个依葫芦画瓢之作,目的就是想了解一下MVC,如果你是高手,我很想得到你的点评,这样的划分和架构是否符合MVC的理念?还有哪些应该改进之
处?
当然,大家都知道现在很多关于MVC的争论,这很正常,就像关于开发语言的争论一样,永无休止,学术上的争论有助于创新。作为我们学技术、用 技术而言,一
定要踏实深入学习,掌握了基本用法之后再去讨论,那才是更高层次的发展,在自己都搞不清的情况下在哪里争论只能是浪费时间。
下面说
说我体会到的MVC的好处,它的确给程序的功能扩展带来方便,比如这个例子我们想要增加一个根据用户名查询留言的功能,只需要在Model里增加一
个查询函数(突然发现这些函数的用法很像存储过程),Controller和View里增加相应的子类,这种分离带来的好处是程序功能模块可以即插即用,
再就是整个程序的逻辑非常清晰。我想,对于需求变动频繁的Web应用来说,这种特性也许是很有价值的。
分享到:
相关推荐
phpmvc,留言本实例,.注解非常详细深入浅出解释MVC的机制
一个简单的php mvc开发实例 可以让你迅速掌握mvc思想,适合入门的新手学习
写完那篇“写给懂C语言的人的PHP基本语法入门”后一直在学习PHP5的OOP,目的很简单,就是想研究MVC的PHP实现,所以,兴趣很快转移到MVC上面,网上有很多长篇大论,但是看完了我还是不能写出一个最简单的MVC程序,我...
简单的MVC,PHP留言板,phpMVC简单教材
标题上我把这个留言板叫最简单的,其实应该叫最简陋的,因为把全部注意力集中在MVC模式设计和实现上,所以UI方面几乎没有一点修饰。之所以在这里跟大家分享这个东西,是因为我自己通过读该老外的代码并仿照着写留言...
自己为了做一个CMS,提前搭的一个单入口MVC,有兴趣的朋友可以下载。
Power2php是一个简单,开源,易扩展(升级),高效,面向对象的轻量级PHP MVC开发框架. 遵循GNU General Public License (GPL) 开源协议发布. Power2php会使开发变得更简单. 框架特点 * 简单,也许是你见过最简单的WEB...
php mvc案例下载,mvc实例,mvc模型案例
NULL 博文链接:https://jackhe.iteye.com/blog/1397838
本文以一个实例的形式讲述了PHP实现MVC框架的过程,比较浅显易懂。现分享给大家供大家参考之用。具体分析如下: 首先,在学习一个框架之前,基本上我们都需要知道什么是mvc,即model-view-control,说白了就是数据...
下面小编就为大家带来一篇一个简单的php MVC留言本实例代码(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
PHP实例开发源码—禅道php mvc框架.zip PHP实例开发源码—禅道php mvc框架.zip PHP实例开发源码—禅道php mvc框架.zip
PHP实例开发源码—EaglePHP PHP MVC开发框架.zip PHP实例开发源码—EaglePHP PHP MVC开发框架.zip PHP实例开发源码—EaglePHP PHP MVC开发框架.zip
PHP实例开发源码—AMP PHP MVC开源框架.zip PHP实例开发源码—AMP PHP MVC开源框架.zip PHP实例开发源码—AMP PHP MVC开源框架.zip
PHP实例开发源码—简易通讯录php MVC构架.zip PHP实例开发源码—简易通讯录php MVC构架.zip PHP实例开发源码—简易通讯录php MVC构架.zip
PHP实例开发源码—php MVC开发框架 zentaophp框架.zip PHP实例开发源码—php MVC开发框架 zentaophp框架.zip PHP实例开发源码—php MVC开发框架 zentaophp框架.zip
这是一个根据MVC模式开发的一个小型框架。 说明: framework文件是框架文件,可将其重命名成你的项目名 Index.php文件是项目的入口文件 Config目录下的config文件配置了数据库的连接,网站url的访问方式 Control...
基于MVC设计模式开发出的简单PHP框架,对于想精通MVC设计模式的同学来说,非常有帮助
PHP实例开发源码—MayFish MVCPHP开发框架.zip PHP实例开发源码—MayFish MVCPHP开发框架.zip PHP实例开发源码—MayFish MVCPHP开发框架.zip