zoukankan      html  css  js  c++  java
  • 理解和实现MVC设计模式

    一、MVC概述

    MVC并不是一段代码,而是一种软件的设计思想,可以指导我们开发项目。

    • Model模型:主要功能,负责与数据库进行操作(增删改查)
    • View视图:主要功能,负责显示输出用户操作界面
    • Controller控制器:主要功能,负责接收用户请求,处理业务逻辑

    二、MVC原理图

    三、PHP实现MVC

    Think.class.php

    //为防止非法入侵
    if(!defined('TOKEN')) exit;
    //定义Think类文件,负责项目初始化九步走
    class Think {
        /**
         * 定义setHeader函数,定义项目的编码格式
         */
        private static function setHeader() {
            //设置响应头信息:告诉浏览器以何种方式解析文档
            header('Content-type:text/html; charset=utf-8');
        }
    
        /**
         * 定义setConst函数,定义项目路径常量
         */
        private static function setConst() {
            //设置路径常量
            define('ROOT_DIR',str_replace('\', '/', realpath(dirname(__FILE__).'/../')));
            //定义核心目录
            define('CORE_DIR',ROOT_DIR.'/Core');
            define('CONFIG_DIR',ROOT_DIR.'/Config');
            define('CONTROLLER_DIR',ROOT_DIR.'/Controller');
            define('MODEL_DIR',ROOT_DIR.'/Model');
            define('VIEW_DIR',ROOT_DIR.'/View');
            define('PUBLIC_DIR','/Public');
        }
    
        /**
         * 设置错误信息
         */
        private static function setError() {
            if(DEBUG) {
                //开发模式
                //设置是否显示错误(On显示Off不显示)
                ini_set('display_errors','On');
                //设置显示错误级别
                error_reporting(E_ALL);
            } else {
                //生产模式
                ini_set('display_errors','Off');
                error_reporting(0);
            }
        }
    
        /**
         * 设置session信息
         */
        private static function setSession() {
            session_start();
        }
    
        /**
         * 设置配置文件信息
         */
        private static function setConfig() {
            $GLOBALS['config'] = include CONFIG_DIR.'/config.php';
        }
    
        /**
         * 设置文件自动加载
         */
        private static function loadCore($class) {
            if(is_file(CORE_DIR."/$class.class.php")) {
                include CORE_DIR."/$class.class.php";
            }
        }
    
        private static function loadController($class) {
            if(is_file(CONTROLLER_DIR."/$class.class.php")) {
                include CONTROLLER_DIR."/$class.class.php";
            }
        }
    
        private static function loadModel($class) {
            if(is_file(MODEL_DIR."/$class.class.php")) {
                include MODEL_DIR."/$class.class.php";
            }
        }
    
        private static function setAutoLoad() {
            //把以上三个函数注册到SPL __autoload函数栈中
            spl_autoload_register('self::loadCore');
            spl_autoload_register('self::loadController');
            spl_autoload_register('self::loadModel');
        }
    
        /**
         * 设置url
         * @param string c:控制器名称
         * @param string a:操作名称(函数名称)
         */
        private static function setUrl() {
            $controller = isset($_REQUEST['c'])?$_REQUEST['c']:'Index';
            $action = isset($_REQUEST['a'])?$_REQUEST['a']:'index';
            //c=Public a=captcha
            //永远不要相信用户的输入
            $controller = strtolower($controller);
            $action = strtolower($action);
            //设置控制其名称首字母大写
            $controller = ucfirst($controller);
            /*
            echo $controller;
            echo '<hr />';
            echo $action;
            */
            //例1:index.php?c=goods&a=index通过setUrl函数自动转化为c=Goods&a=index
            define('CONTROLLER',$controller);
            define('ACTION',$action);
        }
    
        /**
         * 设置访问权限
         */
        private static function setPrivilege() {
            if(!(CONTROLLER=='Public' && (ACTION=='captcha' || ACTION=='login' || ACTION=='signin'))) {
                if(!isset($_SESSION['adminuser'])) {
                    //如果系统中需要Cookie,也是在这里进行判断
                    //如果没有设置session,强制调整到Public控制器下的login方法,要求必须登录后才能跳转
                    header('Location:index.php');
                }
            }
        }
    
        /**
         * 设置路由(请求分发)
         */
        private static function setDispatch() {
            //获取Controller与action参数,进行组装
            //CONTROLLER = 'Category'
            //ACTION = 'index'
            $controller = CONTROLLER.'Controller';  //CategoryController  PublicController
            $action = ACTION;  //$action = index  //$action = captcha
            //实例化控制器
            $controller = new $controller();  //new  CategoryController();
            //调用控制器下的action方法
            $controller->$action();  //$controller->index();
        }
    
        /**
         * 定义run方法实现项目的初始化
         */
        public static function run() {
            //初始化9个函数
            self::setHeader();
            self::setConst();
            self::setError();
            self::setSession();
            self::setConfig();
            self::setAutoLoad();
            self::setUrl();
            //self::setPrivilege();
            self::setDispatch();
        }
    }

    index.php

    //定义TOKEN密钥
    define('TOKEN', 'jason');
    //定义环境(生产环境、开发环境)
    define('DEBUG', true);
    //载入项目的核心文件
    include './Core/Think.class.php';
    //进行项目的初始化
    Think::run();
  • 相关阅读:
    ZOJ3513_Human or Pig
    ZOJ2083_Win the Game
    ZOJ2725_Digital Deletions
    ZOJ2686_Cycle Gameu
    UVALive
    ZOJ2290_Game
    ZOJ3067_Nim
    P3159 [CQOI2012]交换棋子(费用流)
    P3153 [CQOI2009]跳舞(最大流多重匹配)
    P3121 [USACO15FEB]审查(黄金)Censoring (Gold)(ac自动机)
  • 原文地址:https://www.cnblogs.com/chenjiacheng/p/6522623.html
Copyright © 2011-2022 走看看