亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1201 | 回復(fù): 0
打印 上一主題 下一主題

用PHP開始你的MVC(三)實現(xiàn)你的Model層 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2005-12-19 12:20 |只看該作者 |倒序瀏覽
Model層,就是MVC模式中的數(shù)據(jù)處理層,用來進行數(shù)據(jù)和商業(yè)邏輯的裝封
三、實現(xiàn)你的Mode層
Model層,就是MVC模式中的數(shù)據(jù)處理層,用來進行數(shù)據(jù)和商業(yè)邏輯的裝封,進行他的設(shè)計的時候設(shè)計到三個個概念:
------Model類。是實體類。用來保存數(shù)據(jù)庫表格的中一條記錄的所有字段的數(shù)據(jù)。并且可以驗證這條記錄數(shù)據(jù)的完整性。
------ModelManager類。 是實體類的管理類。通常每一個實體類(Model)都要有一個對應(yīng)的管理類(ModelManager)。管理類可以用來管理實體類里面的數(shù)據(jù)紀(jì)錄(例如刪除/添加/更改.....)。 但是ModelManager類不一定要有對應(yīng)的Model類。
------db類。 用來管理對數(shù)據(jù)庫的聯(lián)接。 ModelManager類所有的對數(shù)據(jù)的操作。都是通過這個db類來實現(xiàn)的。 在整個MVC模式中。只有這個db類可以直接對數(shù)據(jù)庫進行操作。同時也只有ModelManager類可以對db類進行調(diào)用。
看上去好象是比較麻煩。但是實際上并不復(fù)雜。這種Model層設(shè)計方式。和網(wǎng)上購物系統(tǒng)的購物車程序是極其相似的。Model可以看作是購物車?yán)锏膯蝹商品的信息類。Manager可以看作是訂單。 訂單是用來管理采購的商品的。
下面是一個簡單的例子。應(yīng)該是比較典型的。著重看他的整個設(shè)計和流程的實現(xiàn)。仔細研究一下。其實不難。
注意:下面例子使用的所有的類和方法都是經(jīng)過簡化的。實際情況比這個要復(fù)雜的多。但是。作為一個實例已經(jīng)是足夠用了。
文件夾結(jié)構(gòu):
|- 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
注意文件夾和文件名的大小寫
內(nèi)容:假設(shè)有一個數(shù)據(jù)庫,保存在兩張表,一張是class(班級)表格,一張是student(學(xué)生)的表格,
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 里面是一個數(shù)據(jù)庫操作管理類,他和里面用的接口和正常使用情況是一樣的, 但是本例只是模擬的實現(xiàn)了這個借口.因此,可以在不用真實數(shù)據(jù)庫的情況下運行.
文件0:(Model.php)Model層實體的基礎(chǔ)類
1, "name"=>"this is name");
    var $data;
    //這個實體類的數(shù)據(jù)約束信息,用來判斷加入的$data數(shù)據(jù)的準(zhǔn)確性
    //see: ClassModel
    var $match;
    //與該實體對應(yīng)的數(shù)據(jù)庫中表的名稱
    var $table;
    //初始化
    function Model(&$data){
        $this->data = &$data;
    }
    //設(shè)置該實體的某個數(shù)據(jù)是值
    function set($key, $value){
        $this->data[$key] = $value;
    }
    //獲取該實體的某個數(shù)據(jù)
    function get($key){
        return $this->data[$key];
    }
    //獲取該實體的全部數(shù)據(jù)
    function getData(){
     return $this->data;
    }
    //獲取該實體的約束信息
    function getMatch(){
     return $this->match;
    }
    //驗證實體數(shù)據(jù)的準(zhǔn)確性和完整性
    function isValid(){
        foreach($this->match as $key=>$value){
            if(!isset($value["null"]) && !isset($this->data[$key])) die("$key 的數(shù)值不能為空");
            //.....可以在加其他的判斷,例如是否超過如許的最大數(shù)值,或長度過長.....
        }
    }
}
?>
文件1:(Manager.php)Model層進行實體管理的基礎(chǔ)類
db = new Db();
    }
    //用來向數(shù)據(jù)庫中插入實體信息
    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)班級信息的實體類
true表示是準(zhǔn)許為空,否則不能為空)
    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);
    }
    //用來獲取這個班級的學(xué)生的信息
    function getStudent(){
     require_once "./Model/StudentManager.php";
        $manager = new StudentManager();
        $classId = $this->get("cls_id");
        return $manager->getList($classId);
    }
}
?>
文件3:(StudentModel.php)學(xué)生信息的實體類
true表示是準(zhǔn)許為空,否則不能為空)
    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)班級實體的管理類
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)學(xué)生實體的管理類
db->query($sql);
    }
}
?>
文件6:(Db.php)數(shù)據(jù)庫聯(lián)接管理類,用于共享并管理數(shù)據(jù)的訪問。由于這個類涉及的內(nèi)容不是本章要討論的內(nèi)容,所以這個類模擬了“真實的數(shù)據(jù)庫管理類的方法”,借口是和正常的類是一樣的,但是接口函數(shù)里面的內(nèi)容是不對的,只是模擬的數(shù)據(jù)。網(wǎng)上有很多這種類的做法,可以自己到晚上找找,(**另外本系列文章的第二章里也有詳細的介紹**)。
con=mysql_connect(********************);...........
   }
   //執(zhí)行數(shù)據(jù)查詢語句
   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("空班級");
   }
   //獲取一條數(shù)查詢結(jié)果
   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");
   }
   //執(zhí)行數(shù)據(jù)庫更新/添加/刪除語句
   function execute($sql){
      //mysql_query($sql);
      echo "
正在進行插入操作
...
插入操作完成
";
      return true;
   }
}
?>
測試文件一、(ModelTest1.php)(查詢班級標(biāo)號(cls_id)為2的班級的學(xué)生的名單)
findOneModel($classId);
$data = &$model->getStudent();
foreach($data as $value)
echo "編號:".$value["stu_id"]." ------ 姓名: ".$value["stu_name"]."
";
?>
返回的結(jié)果是:
編號:1 ------ 姓名: student1
編號:2 ------ 姓名: student2
測試文件二、(ModelTest2.php)(查詢班級標(biāo)號(cls_id)為1的班級的學(xué)生的名單)
findOneModel($classId);
$data = &$model->getStudent();
foreach($data as $value)
echo "編號:".$value["stu_id"]." ------ 姓名: ".$value["stu_name"]."
";
?>
返回的結(jié)果是:
該班級不存在!
測試文件三、(ModelTest3.php)(執(zhí)行數(shù)據(jù)庫的插入工作,向student表添加數(shù)據(jù))
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? "插入操作成功": "插入操作失敗";
?>
返回的結(jié)果是:
正在進行插入操作
...
插入操作完成
插入操作成功
測試文件四、(ModelTest4.php)(執(zhí)行數(shù)據(jù)庫的插入工作,向student表添加數(shù)據(jù))
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? "插入操作成功": "插入操作失敗";
?>
返回的結(jié)果是:
stu_clsid 的數(shù)值不能為空
結(jié)果分析:
StudentModel中"match"的規(guī)定stu_clsid的值是不能為空的,
而代碼中代碼中$data = array("stu_id"=>3, "stu_name"=>"student3");
缺少stu_clsid的值,因此不能通過數(shù)據(jù)的完整性校驗,抱錯.


本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/12228/showart_62247.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP