1、php.MVC 系列教程之前言ASP,JSP,PHP 是 WEB 开发的三大技术,三种技术优缺点也早就有人分析过了。无非也就是 ASP 简单易用且有 microsoft 做靠山,JSP 功能强大是因为有 java 支持,PHP 则开源跨平台。在国内,ASP 应用范围最广,JSP 发展势头最猛,PHP 则处于劣势。这可能与公司的支持以及技术的培训有关。由于公司项目的需要,我这才接触 PHP,用过一段时间后两点体会最深刻,一是学习容易,上手极快,内置函数很多,适合快速开发;二是学习资料匮乏,普及不广,很多时候都要去看英文文档。对于中小型 WEB 应用来说,PHP 有很强的竞争力,LINUX+APA
2、CHE+MYSQL+PHP(LAMP)的组合几乎可以胜任绝大多数网站的解决方案,对于大型应用来讲,对于系统架构要求更高,需要有成熟的框架支持,JSP 的 struts 是个不错的框架,国内介绍它的资料也非常多,应用逐渐广泛起来,对应的 PHP 也有php.MVC,但是我搜遍了网络也没有发现一篇中文文档,这才让我动了翻译用户指南念头,也算是抛砖引玉,希望 PHP 能够在国内蓬勃发展起来。 php.MVC 是 PHP Web 应用程序的一个开源框架,它实现了模型视图控制器(MVC)设计模式Web 应用程序的工业标准,鼓励基于 Model2 架构的应用程序设计。这种开发模式允许网页或其他显示内容从内
3、部应用程序代码中分离出来,让设计者和程序员更容易地集中于他们各自的专业领域。这个框架提供了一个单独入口点的控制器。这个控制器接受 HTTP 请求,并根据配置文件分配给相应的动作处理。模型包含了应用程序的业务逻辑,控制器负责处理请求,并转向到相应的显示组件将 HTML 和PHP 标签的结合起来的模板文件。处理结果返回给客户端浏览器,或者通过另外的协议比如 SMTP。php.MVC 是用 PHP 来实现 Jakarta Struts 框架,目前它支持 Struts 的许多特性,包括申明应用程序的配置参数通过 XML 解析器。比如在 XML 配置文件中指定各种业务逻辑组件与对应的显示组件之间的映射。
4、php.MVC 的网站地址 http:/用 PHP 开始你的 MVC (一)整合你的站点入口这是一篇介绍如何用 php 来实现 MVC 模式开发的文件。关于 MVC 模式的技术文章网上随处可以,所以这篇文件将不再讲述这种模式的优缺点(实际上是我说不清楚) ,子讲他的 php 技术实现。并且在以后的系列文章中也是以讲技术为主。一、实现统一的网站入口(在 MVC 中调用 Controler 层的方法,也就是控制层)大家也许经常在网上看到这样的路径(http:/ 23 种方法可以实现网站的统一接口,合理的整合网站,更好的体现网站的安全性和架构,用这两种方式的网站大多是使用“MVC”模式构建和实现的。
5、下面是一个例子访问路径如下:./test/*/Bad./test/*/Good(其中的“*“可以用任何字符串替换,“.“是你的 web 路径)文件的目录结构如下|- .htaccess|- test|- Application.php|- Controler/GoodControler.php|- Controler/BadControler.php注意 文件“.htaccess“,在 windows 下不能直接建立的,可以在命令行模式下建立.文件 0:(.htaccess)(这个文件是更改 apache 的配置方式用的)forcetype application/x-httpd-php文件
6、1:(test.php)parse();$aa-go();?文件 2:(GoodControler.php)文件 3:(BadControler.php)文件 4:(Application.php)_parsePath();$this-_getControlerFile();$this-_getControlerClassname();/* 解析当前的访问路径,得到要进行动作*/function _parsePath()list($path, $param) = explode(“?“, $_SERVER“REQUEST_URI“);$pos = strrpos($path, “/“);$th
7、is-action = substr($path, $pos+1);/* 通过动作$action,解析得到该$action 要用到的 controler 文件的路径*/function _getControlerFile()$this-controlerFile = “./Controler/“.$this-action.“Controler.php“;if(!file_exists($this-controlerFile)die(“Controler 文件名(“.$this-controlerFile.“)解析错误“);require_once $this-controlerFile;/*
8、通过动作$action,解析得到该$action 要用到的 controler 类名*/function _getControlerClassname()$this-controlerClass = $this-action.“Controler“;if(!class_exists($this-controlerClass)die(“Controler 类名(“.$this-controlerClass.“)解析错误“);/* 调用 controler,执行 controler 的动作*/function go()$c = new $this-controlerClass();$c-contr
9、ol();?用 PHP 开始你的 MVC (二)抽象数据库接口二、抽象数据库接口(利用数据操作管理类)在用 mvc 模式开发的时候,model 层负责数据库的所有操作,为了对数据库的操作进行统一的管理,我们需要定义一个数据库操作管理类,由他来接替所有的数据库操作,也就是整个系统中只有这个数据库操作管理类,可以直接对数据库进行操作,如果其他的类需要对数据库进行操作,那它就必须调用和通过这个类来实现。下面的 Db 类就是一个这样的类。getSeq(art_id, 2, 1);* ?*/* example 2: 分页查询* 1, “name“=“this is name“);var $data;/这
10、个实体类的数据约束信息,用来判断加入的$data 数据的准确性/see: ClassModelvar $match;/与该实体对应的数据库中表的名称var $table;/初始化function Model(/设置该实体的某个数据是值function set($key, $value)$this-data$key = $value;/获取该实体的某个数据function get($key)return $this-data$key;/获取该实体的全部数据function getData()return $this-data;/获取该实体的约束信息function getMatch()retur
11、n $this-match;/验证实体数据的准确性和完整性function isValid()foreach($this-match as $key=$value)if(!isset($value“null“) /.可以在加其他的判断,例如是否超过如许的最大数值,或长度过长.?文件 1:(Manager.php)Model 层进行实体管理的基础类db = new Db();/用来向数据库中插入实体信息function insert($table = $model-table;$match = $model-getMatch();$data = $model-getData();$str1 =
12、$str2 = array();foreach($match as $key=$value)if(isset($data$key)$str1 = $key;$str2 = ($value“type“=“C“)? “.$data$key.“: $data$key;$sql = “INSERT INTO $table (“.implode(“,“, $str1).“) VALUES(“.implode(“,“, $str2).“)“;return $this-db-execute($sql);?文件 2:(ClassModel.php)班级信息的实体类true 表示是准许为空,否则不能为空)var
13、 $match = array(“cls_id“ = array(“name“=“cls_id“, “type“=“I“),“cls_name“ = array(“name“=“cls_name“, “type“=“C“),“cls_address“ = array(“name“=“cls_address“, “type“=“C“, “null“=true);var $table = “class“;/初始化function ClassModel(/用来获取这个班级的学生的信息function getStudent()require_once “./Model/StudentManager.p
14、hp“;$manager = new StudentManager();$classId = $this-get(“cls_id“);return $manager-getList($classId);?文件 3:(StudentModel.php)学生信息的实体类true 表示是准许为空,否则不能为空)var $match = array(“stu_id“ = array(“name“=“stu_id“, “type“=“I“),“stu_clsid“ = array(“name“=“stu_clsid“, “type“=“I“),“stu_name“ = array(“name“=“stu_name“, “type“=“C“, “null“=true);var $table = “student“;/初始化function StudentModel(?文件 4:(ClassManager.php)班级实体的管理类db-query($sql);/查找并返回一个班级的实体类function $data = $this-db-getOne($sql);if($data=null) die(“该班级不存在!“);require_once “./Model/ClassModel.php“;$model = new ClassModel($data);return $model;