博客列表 >MVC单例模式- MVC的实现原理-2018-9-18

MVC单例模式- MVC的实现原理-2018-9-18

THPHP
THPHP原创
2018年09月18日 04:32:18762浏览

1、MVC单例模式:

实例

class Config{
    private static $instance = null;
    // 配置参数容器
    public $setting = [];
    // 设置一个只能通过静态的实例化对象
    public static function getIN(){
        // 判断当前类是否被实例化
        if(self::$instance == null){
            // 如果没有被实例化,就实例化
            self::$instance = new self();
        }
        // 如果存在就返回当前类的实例化
        return self::$instance;
    }
    // 设置配置操作
    public function set(){
        // 获取参数的数量
        $num = func_num_args();
        if($num > 0){
            switch ($num){
                case 1:// 如果为1 那就存在一个数组,
                    $value = func_get_arg(0); // 索引为0
                    if(is_array($value)){
                        // 数组合并,有相同的键会进行覆盖
                        $this->setting = array_merge($this->setting,$value);
                    }
                    break;
                case 2:
                    $name = func_get_arg(0);// 键点索引为0
                    $value = func_get_arg(1);// 键值索引为1
                    $this->setting[$name] = $value;
                    break;
                default:
                    echo '<span style="color:red">非法参数</span>';
            }
        }else{
            echo '<span style="color:red">没有参数</span>';
        }
    }
    // 获取参数: 当无参数的时候,默认获取全部参数(必须设置默认的参数,不然会报错)
    public function get($name =''){
        // 判断参数是否为空
        if (empty($name)){
            // 如果为空就返回setting[] 中的所有的参数
            return $this->setting;
        }
        // 如果有就返回当前的值
        return $this->setting[$name];
    }
}
//实例化静态方法
$obj = Config::getIN();
// 设置键和键值
$obj->set('host','127.0.0.1');
// 查看set方法中传入的host键值
echo $obj->get('host');
echo '<hr>';
// 设置多个参数,以数组的方式
$con = ['host'=>'localhost','user'=>'root','pass'=>'123456'];
$obj->set($con);
// get()方法中的 $name  必须设置默认的参数,不然会报错
print_r($obj->get());

运行实例 »

点击 "运行实例" 按钮查看在线实例

 2、MVC的实现原理:

(1)新建一个model文件夹,存放模型文件(Model.php):

实例

<?php
namespace mvc\model;
class Model{
    // 创建一个数据库连接成员
    public $pdo;
    // 创建一个数据库的结果集
    public $result = [];

    // 构造方法:连接数据库
    public function __construct($dbname,$user,$pass){
        $this->pdo = new \PDO('mysql:host=127.0.0.1;dbname='.$dbname,$user,$pass);
    }
    // 查询语句
    public function select($table,$num){
        //  创建预处理对象
        $stmt = $this->pdo->prepare("SELECT `id`,`name`,`email` FROM {$table} LIMIT :num ");
        // 执行查询
        $stmt->bindValue(':num',$num,\PDO::PARAM_INT);
        $stmt->execute();
        $this->result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

(2)新建一个view文件夹,存放模板文件(View.php):

实例

<?php
namespace mvc\view;
class View{

    public $data = [];
    // 否则方法
    public function  __construct($data){
        $this->data = $data;
    }
    public function getData(){
        return $this->data;
    }
    public function display($data){
        $table =  '<!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>MVC简介</title>
    </head>
    <body>
        <table>
            <caption>信息表</caption>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>邮箱</th>
            </tr>';
        foreach($data as $staff){
            $table .= '<br>';
            $table .= '<td>'.$staff['id'].'</td>';
            $table .= '<td>'.$staff['name'].'</td>';
            $table .= '<td>'.$staff['email'].'</td>';
            $table .= '</br>';
        }
        $table .= '</table></body></html>';
        echo $table;
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

(3)新建一个view文件夹controller,存放系统(把模型和模板文件进行整合)文件(controller.php):

实例

<?php
namespace mvc\controller;
// 导入模型和模板的类
use mvc\model\Model;
use mvc\view\View;
class controller{
    public function index(){
        require './model/Model.php';
        // 实例化对象
        $model = new Model('php','root','root');
        // 调用 Model类中的 select方法(表名,查询的数据个数)
        $model->select('lianxi',1);
        // 用临时变量存储结果集
        $result = $model->result;
        // 导入模板文件
        require './view/view.php';
        // 实例化($result参数是从数据库拿到的结果集)
        $view = new View($result);
        // 调用 View 类中的 getData 方法,来获取数据
        $data = $view->getData();
        // 调用 View 类中的 display 方法,渲染并生生html代码
        // 传入的参数的getData()方法中的数据
        $view->display($data);
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

(4)创建一个框架入口文件也就是首页调用的文件(index.php):

实例

<?php
require './controller/Controller.php';
use mvc\controller\Controller;
$controller = new Controller;
$controller->index();

运行实例 »

点击 "运行实例" 按钮查看在线实例

最后打开框架入口文件(index.php),如果数据库的数据返回到浏览器上,并渲染出来那就是完成了,MVC封装


 MVC的设计思想是什么?

我觉的因为有mvc封装,代码写的会更少点,可以完成更多代码复用性,可以了解到框架的封装知识。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议