您的位置:首页 > 编程语言 > PHP开发

PHP和MVC的结合思想

2006-12-13 21:03 239 查看
form { display: inline }
TABLE, TR, TD { font-family: HelMS Shell Dlg, vetica, Tahoma, Arial; font-size: 9pt; color: #000000 }
a:link, a:visited, a:active { text-decoration: underline; color: #000000 }
a:hover { text-decoration: underline; color: #FF0000 }
.hlight { background-color: #E4E7DA }
.dlight { background-color: #EEF2F7 }
.mainbg { background-color: #ffffff }
.mainfoot { background-color: #f0f0f0 }
.pinned { background-color: #99C7CC }
.forum1 { background-color: #F7F7F7 }
.forum2 { background-color: #EEEEEE }
.post1 { background-color: #f7f7f7 }
.post2 { background-color: #e7e7e7 }
.posthead { background-color: #f5f5f5 }
.postbak { background-color: #D2D2D0 }
.title { background-color: #C4DCF7 }
.row1 { background-color: #FFFFFF }
.row2 { background-color: #FFFFFF }
.postsep { background-color: #D6DBE7; height: 1px }
.signature { font-size: 11px; color: #333399 }
.postdetails { font-size: 11px }
.postcolor, #postcolor { font-size: 9pt; line-height: 160% }
.membertitle { font-size: 10px; line-height: 150%; color: #000000 }
.normalname { font-size: 12px; font-weight: bold; color: #000033; padding-bottom: 2px }
.normalname a:link, .normalname a:visited, .normalname a:active { text-decoration: none; color: #666666; padding-bottom: 2px }
.unreg { font-size: 11px; font-weight: bold; color: #990000 }
.highlight { color: #FF0000 }
.highlight a:link, .highlight a:visited, .highlight a:active { text-decoration: underline; color: #FF0000 }
.highlight a:hover { text-decoration: underline }
.desc { font-size: 11px; color: #434951 }
.small { font-size: 11px; color: #434951 }
.copyright { font-family: HelMS Shell Dlg, vetica, Tahoma, Arial; font-size: 7.5pt; line-height: 12px }
.category { font-weight: bold; line-height: 150%; color: #000000; background-color: #F8F8F8 }
.category a:link, #category a:visited, #category a:active { text-decoration: none; color: #000000 }
.postfoot { font-weight: bold; color: #000000; height: 24px; background-color: ##D6DBE7 }
.titlefoot { font-weight: bold; color: #3A4F6C; height: 24px; background-color: #F0F0F0 }
.titlemedium { font-weight: bold; color: #000000; height: 30px; background-color: #D6DBE7 }
.titlemedium a:link, .titlefoot a:link, .titlemedium a:visited, .titlefoot a:visited, .titlemedium a:active, .titlefoot a:active { text-decoration: none; color: #000080 }
.titlemedium a:hover, .subtitle a:hover, .titlefoot a:hover { text-decoration: underline; color: #FF0000 }
.maintitle { font-weight: bold; color: #FFFFFF; font-size: 12px; height: 26px }
.edit { font-size: 12px }
.fancyborder { border: 1px dashed #999999 }
.solidborder { border: 1px solid #999999 }
.maintitle a:link, .maintitle a:visited, .maintitle a:active { text-decoration: none; color: #000000 }
.maintitle a:hover { text-decoration: underline }
.nav { font-weight: bold; color: #000000; font-size: 8.5pt }
.pagetitle { color: #4C77B6; font-size: 18px; font-weight: bold; letter-spacing: -1px; line-height: 120% }
.useroptions { background-color: #598CC3; height: 25px; font-weight: bold; color: #000000 }
.useroptions a:link, .useroptions a:visited,.useroptions a:active { text-decoration: none; color: #000080 }
.bottomborder { border-bottom: 1px dashed #D2D2D0 }
.linkthru { color: #000080; font-size: 9pt }
.linkthru a:link, .linkthru a:active { text-decoration: none; color: #000000 }
.linkthru a:visited { text-decoration: none; color: #000080 }
.linkthru a:hover { text-decoration: underline; color: #FF0000 }
#QUOTE { font-family: HelMS Shell Dlg, vetica, Arial; font-size: 12px; color: #0000A0; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 20px }
#CODE1 { padding-right: 0.5em; margin-top: 1em; font-size: 9pt; margin-bottom: 1em; margin-left: 0pt; padding-top: 0.5em; font-family: Courier New; background-color: #FFFFFF; color: #465584; border:1px solid #000000; border-left:6px solid #666666; BEH***IOR:url(formatPhpCode.htc) }
.codebuttons { background-color: #FFFFFF; border-bottom: black 1px solid; border-left: black 1px solid; border-right: black 1px solid; border-top: black 1px solid; color: #000000; font-family: Tahoma,Georgia; font-size: 11px }
.forminput { font-size: 9pt; font-family: HelMS Shell Dlg, vetica, HelMS Shell Dlg, vetica, sans-serif; vertical-align: middle }
.textinput { font-size: 9pt; font-family: Courier New, HelMS Shell Dlg, vetica, HelMS Shell Dlg, vetica, sans-serif; vertical-align: middle }
.input { font-size: 9pt; font-family: HelMS Shell Dlg, vetica, HelMS Shell Dlg, vetica, sans-serif; vertical-align: middle }
.btnStyle { background-color: #5D7790; border-width: 2; border-color: #E9E9E9; color: #FFFFFF; cursor: hand; font-family: HelMS Shell Dlg, vetica, sans-serif; font-size: 9pt }
.selStyle { background-color: #FFFFFF; border-bottom: black 1px solid; border-left: black 1px solid; border-right: black 1px solid; border-top: black 1px solid; color: #000000; cursor: hand; font-family: Tahoma,Georgia; font-size: 12px }
.inpStyle { background-color: #FFFFFF; border-bottom: black 1px solid; border-left: black 1px solid; border-right: black 1px solid; border-top: black 1px solid; color: #000000; font-family: Tahoma,Georgia; font-size: 12px }
.member { font-family: Tahoma; color: #003063; font-size: 9px }
.curpage { text-decoration: none; color: #FFFFFF; font-family: Tahoma; font-size: 9px }
.page { text-decoration: none; color: #003063; font-family: Tahoma; font-size: 9px }
.page:link { text-decoration: none; color: #003063; font-family: Tahoma; font-size: 9px }
.page:visited { text-decoration: none; color: #003063; font-family: Tahoma; font-size: 9px }
.page:active { text-decoration: none; color: #FF0000; font-family: Tahoma; font-size: 9px }
.page:hover { text-decoration: none; color: #FF0000; font-family: Tahoma; font-size: 9px }
.mod { text-decoration: underline; color: #000000 }
.mod:link { text-decoration: underline; color: #000000 }
.mod:visited { text-decoration: underline; color: #000000 }
.mod:active { text-decoration: underline; color: #FF0000 }
.mod:hover { text-decoration: none; color: #FF0000 }我彻底摆脱 MVC 的束缚

之所以采用这么一条看上去很自大狂的标题, 目的不是要宣扬个人主义, 而是因为如果把标题的"我"去掉, 就变成我在鼓动大家不要 MVC, 那么我很可能沦为镖靶. 在某种程度上来说, MVC 确实有着积极的意义, 在我心目中 MVC 也曾经是先进的生产方法. 但是, 在 PHP-WEB 开发的世界中, 还有没有更先进的方法呢? 我是本着这个理念去思考和摸索的. 所以本文是一篇探索新路, 开拓新思维的文章, 是本着和诸君共勉的精神而写的, 请各位 MVC 的拥护者稍安毋燥, 和某著名"工业级"模板引擎的专家们不要对号入座, 先冷静地思考一下, 世界上除了模板引擎, 是否还存在更先进的开发方法?

在 Ruby on Rails 出现之前, 我并不知道 Web 开发中的 MVC 应该是什么样子. PHPE 有几篇文章倒是讨论过, 其中也有分歧. 直到我学了 RoR, 以及看了 PHP 世界中崛起的几个仿制品, 我才清楚 MVC 在 Web 开发中的样子. 一度我也认为这是极其聪明的办法. 但是最近我又琢磨出一种代替 MVC 的开发方法, 并且认为把 MVC 用在 PHP 开发上其实算不上聪明. 那么, 不论现在天天 MVC 的, 还是不太认识 MVC 的同学们, 我都先来显摆一下, 说说 Web 开发中的 MVC 是怎么一回事.

MVC 最初是从桌面应用开发中提出来的, 最先提出 MVC 的是 Smalltalk, 后来主流的 OO 开发都接受了 MVC 思想. 而 Web 开发中的 MVC 我想应该是从 Java 阵营中来的(这个我不是很确定), 这里我主要说 RoR 和 CakePHP 中的 MVC 模式, 据说它们的 MVC 模式就是从 Java 中偷来. Ruby on Rails 和 CakePHP 都是拿一个 controller 作为程序的入口, 这个 controller 会包含一个或若干个 models, 每一个 model 都是由一个独立的类实例化出来的, 大部分是 ORM 对象, 和小部分并不对应数据表, 而是用来分担一部分 controller 责任的"模型". 每一个 controller 又会有若干的 action, 每个 action 是一个函数, 分别对应一个 view, 也就是"模板". 程序的每一次执行会化为一个 url, 比如 index.php?controller=home&action=index, 这代表程序将实例化 HomeController 并执行其中的函数 index, 然后包含一个"模板"文件 index, 函数 index 则会把数据变量 set 到模板里面去, 于是我们就看到一个页面. 这一切看上去真是完美无缺, 一个 OO 狂热者必定会为它击节叫好.

但是在 Web 开发中, 特别是在 PHP-Web 开发中, MVC 真的有那么好吗?

我上面提到过, MVC 是由 Smalltalk 阵营提出, 在其它 OO 语言特别是 Java 阵营中遍地开花的. 然而 Smalltalk 和 Java 都是面向对象语言, 而 PHP 本质上是过程式语言, 过程式语言可以比面向对象式语言更加简练.

从一个 action 中把变量 set 进 view 中, MVC 模式是这么传递变量的. 当然 PHP 完全可以这么干, 但是可以更简单, 我的答案您可能会嗤之以鼻, 我的方法就是----全局变量. 从一个 OO 狂热者的角度来看, 全局变量是愚不可及的, 它总是四处破坏封装. 但是 PHP 是一种过程式的语言, 换一种角度来看, 只要代码长度总是可以控制, 全局变量和全局函数铁定比 OO 和 MVC 要省事得多. 基于"代码长度决定项目的开发和维护成本"的原则, 我决定寻找一种能代替 MVC 的模式. 下面阐述我的模式----OO 与 PO 混合仿 MVC 又看不出 MVC 的新模式.

Web 程序总是由 url 触发的, 世界上没有一只鼠标可以同时点击两个链接, 因此对同一个用户来说, Web 程序没有并发进程. 换句话说, MVC 中的同一个 controller 中的不同 action, 它们表现为两个不同的 url, 它们的执行过程是互不相干的.

假设 Web 程序的通用入口是 index.php, 我从这里开始介绍我的模式.

<?php
if ( empty($_SESSION['user']['id']) ) {
$action = 'login'; }
?>


这段代码等于传统 MVC 模式中 AdminController 类中的构造器, 也可以是 Rails 中的一个 before_filter, 不同之处是代码少了很多. 它的作用是把关, 影响全局变量 $action, 把不合法的访问导向 login 页面. 我也可以加入一句 $layout = 'admin', 这样页面输出也会被导向另一种风格.

下面看看 ./apps/admin/login.php

include VIEWS . "/$app/$action.template";


这样就可以把 view 分离出来交给美工人员去做.

以上就是我今天的发言.

转:http://club.phpe.net/index.php?act=ST&f=15&t=12212
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: