仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1365|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页设计用PHP入手下手你的MVC(三)完成你的Model层

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
学习了六个多月PHP了,还是个新手,在这里受到了很多人的帮助,谢谢你们!model   3、完成你的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层实体的基本类
<?php
//用来包装信息实体的基本类
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层停止实体办理的基本类
<?php
//对实体信息停止办理的基本类
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)班级信息的实体类
<?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)先生信息的实体类
<?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)班级实体的办理类
<?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)先生实体的办理类
<?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)数据库联接收理类,用于同享并办理数据的会见。因为这个类触及的内容不是本章要会商的内容,所以这个类摹拟了“真实的数据库办理类的办法”,托言是和正常的类是一样的,然而接口函数外面的内容是不合错误的,只是摹拟的数据。网上有良多这类类的做法,可以本人到早晨找找,(**别的本系列文章的第二章里也有具体的引见**)。
<?php
//数据库操作办理类
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 "<br>正在停止拔出操作<br>...<br>拔出操作完成<br>";
      return true;
   }
}
?>


测试文件1、(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 = new ClassModelManager();
$model = $manager->findOneModel($classId);
$data = &$model->getStudent();
foreach($data as $value)
echo "编号:".$value["stu_id"]." ------ 姓名: ".$value["stu_name"]."<br>";
?>

前往的了局是:
编号:1 ------ 姓名: student1
编号:2 ------ 姓名: student2


测试文件2、(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 = new ClassModelManager();
$model = $manager->findOneModel($classId);
$data = &$model->getStudent();
foreach($data as $value)
echo "编号:".$value["stu_id"]." ------ 姓名: ".$value["stu_name"]."<br>";
?>


前往的了局是:
该班级不存在!


测试文件3、(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 = new StudentModel($data);
require_once "./Model/StudentManager.php";
$manager = new StudentManager($data);
$result = $manager->insert($model);
echo $result? "<h2>拔出操作胜利</h2>": "<h2>拔出操作掉败</h2>";
?>

前往的了局是:
正在停止拔出操作
...
拔出操作完成
拔出操作胜利


测试文件4、(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 = new StudentModel($data);
require_once "./Model/StudentManager.php";
$manager = new StudentManager($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的值,因而不克不及经由过程数据的完全性校验,抱错.



不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。
变相怪杰 该用户已被删除
沙发
 楼主| 发表于 2015-2-4 10:02:10 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
飘灵儿 该用户已被删除
板凳
发表于 2015-2-6 17:48:06 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-9 18:17:49 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
金色的骷髅 该用户已被删除
5#
发表于 2015-2-13 00:56:49 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
山那边是海 该用户已被删除
6#
发表于 2015-2-21 20:04:34 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
小女巫 该用户已被删除
7#
发表于 2015-3-1 09:38:54 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
冷月葬花魂 该用户已被删除
8#
发表于 2015-3-10 13:07:12 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
爱飞 该用户已被删除
9#
发表于 2015-3-17 08:01:48 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
10#
发表于 2015-3-19 15:14:50 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
深爱那片海 该用户已被删除
11#
发表于 2015-3-20 05:55:16 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
精灵巫婆 该用户已被删除
12#
发表于 2015-3-21 13:00:17 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
若天明 该用户已被删除
13#
发表于 2015-4-1 22:11:19 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
海妖 该用户已被删除
14#
发表于 2015-4-6 18:11:25 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
再现理想 该用户已被删除
15#
发表于 2015-4-26 04:20:34 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
只想知道 该用户已被删除
16#
发表于 2015-4-30 06:44:36 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
蒙在股里 该用户已被删除
17#
发表于 2015-5-3 11:51:01 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
小魔女 该用户已被删除
18#
发表于 2015-5-6 09:09:31 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
愤怒的大鸟 该用户已被删除
19#
发表于 2015-5-6 18:09:34 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
简单生活 该用户已被删除
20#
发表于 2015-6-13 22:21:42 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 13:42

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表