用PHP开始你的MVC(三)实现你的Model层

博客围绕用PHP实现MVC架构的Model层展开,属于后端开发中PHP技术应用,与信息技术紧密相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用PHP开始你的MVC(三)实现你的Model层

三、实现你的Mode层

Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封,进行他的设计的时候设计到三个个概念:
------Model类。是实体类。用来保存数据库表格的中一条记录的所有字段的数据。并且可以验证这条记录数据的完整性。
------ModelManager类。是实体类的管理类。通常每一个实体类(Model)都要有一个对应的管理类(ModelManager)。管理类可以用来管理实体类里面的数据纪录(例如删除/添加/更改.....)。但是ModelManager类不一定要有对应的Model类。
------db类。用来管理对数据库的联接。ModelManager类所有的对数据的操作。都是通过这个db类来实现的。在整个MVC模式中。只有这个db类可以直接对数据库进行操作。同时也只有ModelManager类可以对db类进行调用。

看上去好象是比较麻烦。但是实际上并不复杂。这种Model层设计方式。和网上购物系统的购物车程序是极其相似的。Model可以看作是购物车里的单个商品的信息类。Manager可以看作是订单。订单是用来管理采购的商品的。



下面是一个简单的例子。应该是比较典型的。着重看他的整个设计和流程的实现。仔细研究一下。其实不难。

注意:下面例子使用的所有的类和方法都是经过简化的。实际情况比这个要复杂的多。但是。作为一个实例已经是足够用了。


文件夹结构:

|-Db.php
|-Model.php
|-Manager.php
|-ModelTest1.php
|-ModelTest2.php
|-ModelTest3.php
|-ModelTest4.php
|-Model/
|-Model/ClassModel.php
|-Model/StudentModel.php
|-Model/ClassManager.php
|-Model/StudentManager.php
注意文件夹和文件名的大小写


内容:假设有一个数据库,保存在两张表,一张是class(班级)表格,一张是student(学生)的表格,

class表格字段:cls_id----------int--------notnull
cls_name--------string-----notnull
cls_address-----string-----null

student表格字段:stu_id----------int--------notnull
stu_clsid-------int--------notnull
stu_name--------string-----null


ClassModel.php里面是class表的一个实体类ClassModel
ClassManager.php里面是ClassModel的管理类ClassManager
StudentModel.php里面是student表的一个实体类StudentModel
StudentManager.php里面是StudentModel的管理类StudentManager
Db.php里面是一个数据库操作管理类,他和里面用的接口和正常使用情况是一样的,但是本例只是模拟的实现了这个借口.因此,可以在不用真实数据库的情况下运行.


文件0:(Model.php)Model层实体的基础类

<?php
//用来包装信息实体的基础类
classModel{
//这个实体类的数据,
//example:array("id"=>1,"name"=>"thisisname");
var$data;
//这个实体类的数据约束信息,用来判断加入的$data数据的准确性
//see:ClassModel
var$match;
//与该实体对应的数据库中表的名称
var$table;
//初始化
functionModel(&$data){
$this->data=&$data;
}
//设置该实体的某个数据是值
functionset($key,$value){
$this->data[$key]=$value;
}
//获取该实体的某个数据
functionget($key){
return$this->data[$key];
}
//获取该实体的全部数据
functiongetData(){
return$this->data;
}
//获取该实体的约束信息
functiongetMatch(){
return$this->match;
}
//验证实体数据的准确性和完整性
functionisValid(){
foreach($this->matchas$key=>$value){
if(!isset($value["null"])&&!isset($this->data[$key]))die("$key的数值不能为空");
//.....可以在加其他的判断,例如是否超过如许的最大数值,或长度过长.....
}
}
}
?>


文件1:(Manager.php)Model层进行实体管理的基础类

<?php
//对实体信息进行管理的基础类
classManager{
//数据库管理类对象
var$db;
//初始化
functionManager(){
$this->db=newDb();
}
//用来向数据库中插入实体信息
functioninsert(&$model){
$model->isvalid();
$table=$model->table;
$match=$model->getMatch();
$data=$model->getData();
$str1=$str2=array();
foreach($matchas$key=>$value){
if(isset($data[$key])){
$str1[]=$key;
$str2[]=($value["type"]=="C")?"/"".$data[$key]."/"":$data[$key];
}
}
$sql="INSERTINTO$table(".implode(",",$str1).")VALUES(".implode(",",$str2).")";
return$this->db->execute($sql);
}
}
?>


文件2:(ClassModel.php)班级信息的实体类

<?php
//用来包装班级信息的实体类
classClassModelextendsModel{

var$data=array();
//$match中,
//type用来表示数据的类型(I表示整数,C表示是字符串)
//name用来表示在数据库表中的字段名
//null表示该字段的值是否准许为空
//(数组中有"null"=>true表示是准许为空,否则不能为空)
var$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";
//初始化
functionClassModel(&$data){
parent::Model($data);
}
//用来获取这个班级的学生的信息
functiongetStudent(){
require_once"./Model/StudentManager.php";
$manager=newStudentManager();
$classId=$this->get("cls_id");
return$manager->getList($classId);
}
}
?>


文件3:(StudentModel.php)学生信息的实体类

<?php
//用来包装学生信息的实体类
classStudentModelextendsModel{

var$data=array();
//$match中,
//type用来表示数据的类型(I表示整数,C表示是字符串)
//name用来表示在数据库表中的字段名
//null表示该字段的值是否准许为空
//(数组中有"null"=>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";
//初始化
functionStudentModel(&$data){
parent::Model($data);
}
}
?>


文件4:(ClassManager.php)班级实体的管理类

<?php
//班级实体信息的管理类
classClassModelManagerextendsManager{
//初始化
functionClassModelManager(){
parent::Manager();
}
//获取班级列表
function&getList(){
$sql="SELECT*FROMclass";
return$this->db->query($sql);
}
//查找并返回一个班级的实体类
function&findOneModel($id){
$sql="SELECT*FORMclassWHEREcls_id=$id";
$data=$this->db->getOne($sql);
if($data==null)die("该班级不存在!");
require_once"./Model/ClassModel.php";
$model=newClassModel($data);
return$model;
}
}
?>


文件5:(StudentManager.php)学生实体的管理类

<?php
//学生信息实体的管理类
classStudentManagerextendsManager{
//初始化
functionStudentManager(){
parent::Manager();
}
//获取某个班级的学生的列表
function&getList($classId){
$sql="SELECT*FROMstudentWHEREstu_clsid=$classId";
return$this->db->query($sql);
}
}
?>


文件6:(Db.php)数据库联接管理类,用于共享并管理数据的访问。由于这个类涉及的内容不是本章要讨论的内容,所以这个类模拟了“真实的数据库管理类的方法”,借口是和正常的类是一样的,但是接口函数里面的内容是不对的,只是模拟的数据。网上有很多这种类的做法,可以自己到晚上找找,(**另外本系列文章的第二章里也有详细的介绍**)。

<?php
//数据库操作管理类
classDb{
//数据库联接
var$con;
//初始化
functionDb(){
//$this->con=mysql_connect(********************);...........
}
//执行数据查询语句
function&query($sql){
//$result=mysql_query($sql);..................
//return$result;
if($sql=="SELECT*FROMstudentWHEREstu_clsid=2")
returnarray("0"=>array("stu_id"=>1,"stu_clsid"=>2,"stu_name"=>"student1"),
"1"=>array("stu_id"=>2,"stu_clsid"=>2,"stu_name"=>"student2")
);
die("空班级");
}
//获取一条数查询结果
functiongetOne($sql){
//$result=mysql_query($sql);.............
//return$result[0];
if($sql=="SELECT*FORMclassWHEREcls_id=1")
returnnull;
if($sql=="SELECT*FORMclassWHEREcls_id=2")
returnarray("cls_id"=>2,"cls_name"=>"classname","cls_address"=>"classaddress");
}
//执行数据库更新/添加/删除语句
functionexecute($sql){
//mysql_query($sql);
echo"<br>正在进行插入操作<br>...<br>插入操作完成<br>";
returntrue;
}
}
?>


测试文件一、(ModelTest1.php)(查询班级标号(cls_id)为2的班级的学生的名单)

<?php
error_reporting(E_ALL);
require_once"Db.php";
require_once"Model.php";
require_once"Manager.php";

$classId=2;

require_once"./Model/ClassManager.php";
$manager=newClassModelManager();
$model=$manager->findOneModel($classId);
$data=&$model->getStudent();
foreach($dataas$value)
echo"编号:".$value["stu_id"]."------姓名:".$value["stu_name"]."<br>";
?>

返回的结果是:

编号:1------姓名:student1
编号:2------姓名:student2


测试文件二、(ModelTest2.php)(查询班级标号(cls_id)为1的班级的学生的名单)

<?php
error_reporting(E_ALL);
require_once"Db.php";
require_once"Model.php";
require_once"Manager.php";

$classId=1;

require_once"./Model/ClassManager.php";
$manager=newClassModelManager();
$model=$manager->findOneModel($classId);
$data=&$model->getStudent();
foreach($dataas$value)
echo"编号:".$value["stu_id"]."------姓名:".$value["stu_name"]."<br>";
?>


返回的结果是:

该班级不存在!


测试文件三、(ModelTest3.php)(执行数据库的插入工作,向student表添加数据)

<?php
error_reporting(E_ALL);
require_once"Db.php";
require_once"Model.php";
require_once"Manager.php";

$data=array("stu_id"=>3,"stu_clsid"=>2,"stu_name"=>"student3");
require_once"./Model/StudentModel.php";
$model=newStudentModel($data);
require_once"./Model/StudentManager.php";
$manager=newStudentManager($data);
$result=$manager->insert($model);
echo$result?"<h2>插入操作成功</h2>":"<h2>插入操作失败</h2>";
?>

返回的结果是:

正在进行插入操作
...
插入操作完成

插入操作成功


测试文件四、(ModelTest4.php)(执行数据库的插入工作,向student表添加数据)

<?php
error_reporting(E_ALL);
require_once"Db.php";
require_once"Model.php";
require_once"Manager.php";

$data=array("stu_id"=>3,"stu_name"=>"student3");
require_once"./Model/StudentModel.php";
$model=newStudentModel($data);
require_once"./Model/StudentManager.php";
$manager=newStudentManager($data);
$result=$manager->insert($model);
echo$result?"<h2>插入操作成功</h2>":"<h2>插入操作失败</h2>";
?>

返回的结果是:

stu_clsid的数值不能为空

结果分析:

StudentModel中"match"的规定stu_clsid的值是不能为空的,
而代码中代码中$data=array("stu_id"=>3,"stu_name"=>"student3");
缺少stu_clsid的值,因此不能通过数据的完整性校验,抱错.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值