zoukankan      html  css  js  c++  java
  • php : MVC 演示(使用单例工厂)

    此例子是MVC的简单应用, 要达到的效果如下:

    用户列表:

    姓名 年龄 学历 兴趣 出生地 账号创建时间 操作
    keen 20 高中 篮球,足球 广东 2016-11-08 10:00:31 删除
    andi 30 本科 乒乓球 上海 2016-11-22 10:00:55 删除
    ddddddd 40 初中 台球 广州 2016-11-10 12:20:49 删除
    eeeeeee 34 大专 慢跑 深圳 2016-11-15 12:21:26 删除

    当前用户总数: 4

    一.设计表

    create table if not exists tab_users(
    	id int auto_increment primary key,
    	name varchar(50) not null,
    	age int default 18,
    	edu varchar(20),
    	hobby varchar(200),
    	born_place varchar(20),
    	create_time datetime
    );
    

    执行, 自己填入数据

    二.相关类

    1. 基本类, 已经构造了对数据库访问的链接资源

    BaseModel.class.php

    <?php
    include './MySQLDB.class.php';
    
    class BaseModel{
        // 存储数据库工具类实例
        protected $db = null;
    
        function __construct(){
            $config = array(
                'host' => 'localhost',
                'port' => 3306,
                'user' => 'root',
                'pwd' => '123456',
                'charset' => 'utf8',
                'dbname' => 'db1'  
            );
    
            $this->db = MySQLDB::GetInstance($config);
        }
    }
    ?>
    

    2.用户模型类, 封装了获取用户相关数据的方法

    UserModel.class.php

    <?php
    /*
        用户模型
    */
    include './BaseModel.class.php';
    
    class UserModel extends BaseModel{
        
        function getAllUsers(){
            $sql = "select * from tab_users";
            return $this->db->getRows($sql);
        }
    
        function getUsersCount(){
            $sql = "select count(*) from tab_users";
            return $this->db->getOneData($sql);
        }
    
        function delUserById($id){
            $sql = "delete from tab_users where id = '$id'";
            return $this->db->exec($sql);
        }
    }
    ?>
    

    3.单例工厂类: 通过类名,获取唯一实例

    ModelFactory.class.php

    <?php
    /*
        单例工厂类
    */
    class ModelFactory{
        static $models = array(); // 用于存储各个模型的唯一实例
    
        static function M($className){
            if(!isset(static::$models[$className]) || // 不存在
               !(static::$models[$className] instanceof $className)){ // 不是其实例
                    static::$models[$className] = new $className();
               }
            return static::$models[$className];
        }
    }
    ?>
    

      

    4.控制器: 先调用模型,获取数据.然后再载入视图,显示数据

    showAllUserController.php

    <?php
    /*
        显示所有用户的控制器
    */
    header("content-type:text/html;charset=utf8"); // 设置输出的字符串编码为utf8
    include './UserModel.class.php';
    include './ModelFactory.class.php';
    
    // 判断动作
    if(!empty($_GET['act']) && $_GET['act'] == 'del'){
        $id = $_GET['id'];
        $obj = ModelFactory::M("UserModel");
        $obj->delUserById($id);
        echo "<p style='color:red;'>删除数据成功!</p>";
    }
    
    // 获取数据
    $user_obj = ModelFactory::M("UserModel");
    $data1 = $user_obj->getAllUsers();
    /*
    echo "<pre>";
    print_r($data1);
    echo "</pre>";
    */
    $data2 = $user_obj->getUsersCount();
    
    // 载入视图文件, 显示数据
    include './showAllUserView.html';
    ?>
    

    5.视图

    showAllUserView.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn">
    
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        <title>网页标题</title>
        <meta name="keywords" content="关键字列表" />
        <meta name="description" content="网页描述" />
        <link rel="stylesheet" type="text/css" href="" />
        <style type="text/css">
    
        </style>
        <script type="text/javascript">
            function del_confirm() {
                console.log('进入 confirm 方法中...');
                return window.confirm("你真的要删除吗?");
            }
        </script>
    </head>
    
    <body>
        用户列表:
        <table border="1">
            <tr>
                <td>姓名</td>
                <td>年龄</td>
                <td>学历</td>
                <td>兴趣</td>
                <td>出生地</td>
                <td>账号创建时间</td>
                <td>操作</td>
            </tr>
            <?php
            foreach($data1 as $rec){
        ?>
                <tr>
                    <td><?php echo $rec['name']; ?></td>
                    <td><?php echo $rec['age']; ?></td>
                    <td><?php echo $rec['edu']; ?></td>
                    <td><?php echo $rec['hobby']; ?></td>
                    <td><?php echo $rec['born_place']; ?></td>
                    <td><?php echo $rec['create_time']; ?></td>
                    <td>
                        <a href="?act=del&id=<?php echo $rec['id']; ?>" onclick="return del_confirm()">删除</a>
                    </td>
                </tr>
                <?php
            }
        ?>
        </table>
    
        当前用户总数:
        <?php echo $data2; ?>
    </body>
    
    </html>
    View Code

    ps:

    MySQLDB.class.php

    <?php
    /*
    设计一个类:mysql数据库操作类
    设计目标:
    1,该类一实例化,就可以自动连接上mysql数据库;
    2,该类可以单独去设定要使用的连接编码(set  names  XXX)
    3,该类可以单独去设定要使用的数据库(use  XXX);
    4,可以主动关闭连接;
    */
    
    class MySQLDB{
        private $link = null; // 用于存储成功链接后的资源
    
        // 属性, 存储链接数据库的基本信息
        private $host;
        private $port;
        private $user;
        private $pwd;
        private $charset;
        private $dbname;
    
        // 1)私有化构造方法
        private function __construct($config){
            // 保存链接的基本信息
            $this->host = !empty($config['host']) ? $config['host'] : "localhost";
            $this->port = !empty($config['port']) ? $config['port'] : "3306";
            $this->user = !empty($config['user']) ? $config['user'] : "root";
            $this->pwd = !empty($config['pwd']) ? $config['pwd'] : "";
            $this->charset = !empty($config['charset']) ? $config['charset'] : "utf8";
            $this->dbname = !empty($config['dbname']) ? $config['dbname'] : "mysql";
            
            // 链接数据库
            $this->link = mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd")
                or die("链接失败");
    
            // 设定编码
            //mysql_query("set names {$config['charset']}");
            $this->setCharset($config['charset']);
    
            // 设定要使用的数据库名
            //mysql_query("use {$config['dbname']}");
            $this->selectDB($config['dbname']);
        }
    
        // 2)单例, 存储唯一实例
        private static $instance = null;
    
        // 3)静态方法,获取唯一实例
        static function GetInstance($config){
            //if(!isset(self::$instance)){ // ==>等价于
            if(!(self::$instance instanceof self)){ // 更常用
                 self::$instance = new self($config); // 创建并保存起来
            }
            return self::$instance;
        }
    
        // 4)私有化克隆方法
        private function __clone(){}
    
        // 可设定要使用的编码
        function setCharset($charset){
            mysql_query("set names $charset", $this->link);
        }
    
        // 可设定要使用的数据库
        function selectDB($dbname){
            mysql_query("use $dbname", $this->link);
        }
    
        // 可关闭数据库链接
        function closeDB(){
            mysql_close($this->link);
        }
    
        // 执行 sql 语句,进行错误处理,并返回结果
        private function query($sql){
            $result = mysql_query($sql, $this->link);
            if($result === false){
                // 失败处理
                echo "sql语句执行失败,请参考如下信息:";
                echo "<br />错误代码: " . mysql_errno();
                echo "<br />错误信息: " . mysql_error();
                echo "<br />错误语句: " . $sql;
                die(); 
            }
            return $result;
        }
    
        // 执行一条 增删改 sql语句,返回真或假
        function exec($sql){
            $result = $this->query($sql);
            return true;
        }
        
        // 执行一条 sql 语句,返回一行记录
        function getOneRow($sql){
            $result = $this->query($sql);
            $rec = mysql_fetch_assoc($result);
            // 提前销毁结果集,否则需要等待页面结束才能自动销毁
            mysql_free_result($result);
            return $rec;
        }
    
        // 执行一条 sql 语句,返回多行记录
        function getRows($sql){
            $result = $this->query($sql);
            $arr = array();
            while($rec = mysql_fetch_assoc($result)){
                $arr[] = $rec; // 二维数组
            }
    
            mysql_free_result($result);
            return $arr;
        }
    
        // 执行一条 sql 语句,直接返回一个结果
        // 类似于: select  count(*) as c  from  user_list
        function getOneData($sql){
            $result = $this->query($sql);
            $rec = mysql_fetch_row($result);
            $data = $rec[0];
            mysql_free_result($result);
            return $data;
        }
    }
    ?>
    View Code

     

    生活不止眼前, 还有诗和远方. end.

  • 相关阅读:
    单例模式
    BeanFactory VS ApplicationContext
    java利用接口和适配器进行完全解耦参考《thinking in java》
    javascr*pt对象的创建相对java 怎样去创建了"类"*以及实例化对象
    实例化bean
    Spring AOP With AspectJ
    spring入门之环境搭建
    项目中ApplicationContext
    BeanFactory VS FactoryBean
    软开心法十四||软件改进
  • 原文地址:https://www.cnblogs.com/KeenLeung/p/6050497.html
Copyright © 2011-2022 走看看