0

0

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

php中文网

php中文网

发布时间:2016-06-21 09:07:01

|

1102人浏览过

|

来源于php中文网

原创

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--------not null
                    cls_name--------string-----not null
                    cls_address-----string-----null

student表格字段:stu_id----------int--------not null
     stu_clsid-------int--------not null
        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层实体的基础类

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


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

//对实体信息进行管理的基础类
class Manager{
    //数据库管理类对象
    var $db;
    //初始化
    function Manager(){
     $this->db = new Db();
    }
    //用来向数据库中插入实体信息
    function insert(&$model){
     $model->isvalid();
        $table = $model->table;
        $match = $model->getMatch();
        $data = $model->getData();
        $str1 = $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)班级信息的实体类

//用来包装班级信息的实体类
class ClassModel extends Model{

    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";
    //初始化
    function ClassModel(&$data){
     parent::Model($data);
    }
    //用来获取这个班级的学生的信息
    function getStudent(){
     require_once "./Model/StudentManager.php";
        $manager = new StudentManager();
        $classId = $this->get("cls_id");
        return $manager->getList($classId);
    }
}
?>
 


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

//用来包装学生信息的实体类
class StudentModel extends Model{

    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";
    //初始化
function StudentModel(&$data){
     parent::Model($data);
    }
}
?>
 


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

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


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

//学生信息实体的管理类
class StudentManager extends Manager{
    //初始化
function StudentManager(){
        parent::Manager();
    }
    //获取某个班级的学生的列表
    function &getList($classId){
        $sql = "SELECT * FROM student WHERE stu_clsid=$classId";
        return $this->db->query($sql);
    }
}
?>
 


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

迷你天猫商城
迷你天猫商城

迷你天猫商城是一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。所有页面均兼容IE10及以上现代浏览器。部署方式1、项目

下载

//数据库操作管理类
class Db{
   //数据库联接
   var $con;
   //初始化
   function Db(){
       //$this->con=mysql_connect(********************);...........
   }
   //执行数据查询语句
   function &query($sql){
       //$result = mysql_query($sql); ..................
       //return $result;
       if($sql=="SELECT * FROM student WHERE stu_clsid=2")
        return array("0"=>array("stu_id"=>1, "stu_clsid"=>2, "stu_name"=>"student1"),
                      "1"=>array("stu_id"=>2, "stu_clsid"=>2, "stu_name"=>"student2")
                         );
       die("空班级");
   }
   //获取一条数查询结果
   function getOne($sql){
       //$result = mysql_query($sql); .............
       //return $result[0];
       if($sql=="SELECT * FORM class WHERE cls_id=1")
        return null;
       if($sql=="SELECT * FORM class WHERE cls_id=2")
        return array("cls_id"=>2, "cls_name"=>"classname", "cls_address"=>"classaddress");
   }
   //执行数据库更新/添加/删除语句
   function execute($sql){
      //mysql_query($sql);
      echo "
正在进行插入操作
...
插入操作完成
";
      return true;
   }
}
?>
 


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

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

$classId = 2;

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

返回的结果是:

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


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

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

$classId = 1;

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


返回的结果是:

该班级不存在!
 


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

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 = new StudentModel($data);
require_once "./Model/StudentManager.php";
$manager = new StudentManager($data);
$result = $manager->insert($model);
echo $result? "

插入操作成功

": "

插入操作失败

";
?>
 

返回的结果是:

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

插入操作成功
 


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

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 = new StudentModel($data);
require_once "./Model/StudentManager.php";
$manager = new StudentManager($data);
$result = $manager->insert($model);
echo $result? "

插入操作成功

": "

插入操作失败

";
?>
 

返回的结果是:

stu_clsid 的数值不能为空
 

结果分析:

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


 



PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

22

2026.02.04

学习通网页版入口与在线学习指南 学习通官网登录与使用方法
学习通网页版入口与在线学习指南 学习通官网登录与使用方法

本专题详细汇总了学习通网页版入口与登录方法,提供学习通官方网页端入口、学生登录平台、网页版使用指南等内容,帮助用户快速稳定地登录学习通官网,顺利进入学习平台,提升学习效率和体验。

6

2026.02.04

Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

3

2026.02.04

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

3

2026.02.04

Golang 容器化与 Docker 实战
Golang 容器化与 Docker 实战

本专题深入讲解 Golang 应用的容器化与 Docker 部署,涵盖 Docker 基础概念、容器构建与镜像管理、Go 应用的 Dockerfile 编写、跨平台容器部署与优化、Docker Compose 和 Kubernetes 部署工具。通过实际案例,帮助学习者掌握 如何将 Golang 应用容器化并实现高效部署与管理,提升系统的可扩展性与运维效率。

3

2026.02.04

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

59

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

107

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

52

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

9

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Web Forms  教程
Web Forms 教程

共19课时 | 3.9万人学习

Web Pages 教程
Web Pages 教程

共64课时 | 22.6万人学习

ASP.NET 教程
ASP.NET 教程

共78课时 | 42万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号