仓酷云

标题: PHP网页设计用PHP入手下手你的MVC(三)完成你的Model层 [打印本页]

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




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2