0

0

php源码之实现单入口MVC结构的方法

不言

不言

发布时间:2018-07-04 14:43:10

|

2270人浏览过

|

来源于php中文网

原创

这篇文章主要介绍了关于php源码之实现单入口mvc结构的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

主要:

  1. MVC目录结构

  2. 数据库工具类制作

  3. 创建公共模型类和公共控制器类

    立即学习PHP免费学习笔记(深入)”;

--------------:--------------------------------------
blog
├─index.php  入口文件
├─Model 模型
│  └─UserModel.class.php 用户模型类
├─View 视图
│  └─login.html  登录表单页面
├─Controller 控制器
│  └─UserController.class.php 用户控制器
├─Frame 公共使用的类
│   ├─BaseModel.class.php 数据库连接类
│   ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)
│   └─Db.class.php 数据库操作工具类
└─Public   静态公共文件(js,css,images)
    ├─js/   js文件
    ├─css/  css样式文件
    └─images img图片
-----------------------------------------------------------------

MVC目录结构

  1)准备: 创建分支

1 $ git checkout master2 $ git checkout -b "mvc-dbtools-base"

  2) 创建目录结构:

      MVC目录: Model/  Controller/   View/  

        静态资源目录: Public/

  3) 创建项目入口文件  【index.php】

    拷贝原login.php的编码header(...)

    引入创建的控制器UserController 和 模型 UserModel

 1 <?php 
 2 /** 
 3  * 入口文件 
 4  */ 
 5 header("content-type:text/html;charset=utf-8"); 
 6  
 7 require_once('Model/UserModel.class.php'); 
 8 require_once 'Controller/UserController.class.php'; 
 9 
 10 //实例化控制器
 11 $userCtr = new UserController();
 12 
 13 $a = !empty($_GET['a']) ? $_GET['a'] : 'login';
 14 
 15 $userCtr -> $a();

  4)  创建控制器UserController   【Controller/UserController.class.php】

 1 <?php 
 2 /** 
 3  * UserController.class.php 用户控制器 
 4  */ 
 5  
 6 class UserController { 
 7     /** 
 8      * 展示登录界面 
 9      * @access public
 10      */
 11     public function login()
 12     {
 13         include "View/login.html";
 14     }
 15 
 16     /**
 17      * 登录操作: 校验登录信息
 18      */
 19     public function dlogin()
 20     {
 21         //接收登录信息
 22         $data = array();
 23         $data['username'] = trim($_POST['username']);
 24         $data['pwd'] = trim($_POST['pwd']);
 25 
 26         //实例化模型,调用模型方法,校验用户名和密码
 27         $model = new UserModel();
 28         $result = $model->checkLoginInfo($data);
 29 
 30         //结果提示信息
 31         if($result){
 32             exit('登录成功');
 33         } else {
 34             echo "用户名或密码不正确!";
 35             header('refresh:3; url=?');
 36         }
 37     }
 38 }

  5)  创建用户模型类UserModel  【Model/UserModel.class.php】

    实现方法:checkLoginInfo() 检验用户名和密码

<?php/**
 * UserModel.class.php
 *     用户模型类-操作表pbg_users */class UserModel
{    /**
     * 检验登录信息
     * @param  array $data 用户提交的登录信息
     * @return bool       
     true-校验成功 false-校验失败     */
    public function checkLoginInfo($data)
    {        //连接数据库
        $conn = @mysql_connect('localhost','root','root') or die('连接数据库失败!');        
        mysql_query('set names utf8',$conn);        
        mysql_query('use web',$conn);        //查询数据库
        $sql = "select username,pwd from pbg_users where username='{$data['username']}'";        
        $res = mysql_query($sql,$conn);        //登录结果提示信息
        if($res !== false){            
        $user = mysql_fetch_array($res);            
        if( $user['pwd'] == md5($data['pwd']) ){                
        return true;
            }
        }        return false;
    }
}

查看用户模型类

  6)登录视图:【view/login.html】

    引入路径的修正,

    表单提交action修正:  action=?a=dlogin

 1 <!DOCTYPE html> 
 2 <html lang="zh-CN"> 
 3 <head> 
 4     <meta charset="UTF-8"> 
 5     <title>登录</title> 
 6     <link rel="stylesheet" type="text/css" href="public/layui/css/layui.css"> 
 7     <link rel="stylesheet" type="text/css" href="public/css/style.css"> 
 8 </head> 
 9 <body>
 10 <p class="container">
 11     <p class="content">
 12         <form action="?a=dlogin" class="layui-form" method="post">
 13             <p class="layui-form-item">
 14                 <h2>登录</h2>
 15             </p><hr>
 16 
 17             <p class="layui-form-item">
 18                 <label class="layui-form-label">用户名:</label>
 19                 <p class="layui-input-block">
 20                     <input type="text" name="username" class="layui-input" required  lay-verify="required"  placeholder="请输入用户名" autocomplete="off" >
 21                 </p>22             </p>23 24             <p class="layui-form-item">25                 <label class="layui-form-label">密   码:</label>
 26                 <p class="layui-input-block">27                     <input type="password" name="pwd" required lay-verify="required" placeholder="请输入密码"  class="layui-input">
 28                 </p>29             </p>30 31             <p class="layui-form-item">
 32                 <p class="layui-input-block">
 33                     <button  lay-submit class="layui-btn">登录</button>
 34                     <button type="reset" class="layui-btn layui-btn-primary">重置</button>
 35                 </p>36             </p>37         </form>38     </p>39 </p>40 <script type="text/javascript" src="public/layui/layui.js"></script>41 <script>
 42     layui.use('form', function(){43         var form = layui.form;44     });45 </script>46 </body>47 </html>

点击查看登录视图源码

数据库连接操作都在模型中,可以提取出来制作数据库操作工具类

数据库工具类制作

数据库连接,设置编码,选择数据库

实现单例

万彩AI
万彩AI

多功能AI创作工具合集,支持AI写作、AI换脸、AI数字人等

下载

获取一行数据getOneRow,  获取单个数组 getOneData, 获取多行getAllRows, 增删改 exec

自动生成insert 或 update语句 autoExecute()

【Frame/Db.class.php】

  1 <?php 
  2  /**  
  3   * Db.class.php 数据库操作工具类  
  4   * @author young  
  5   */  
  6    
  7  class Db  
  8  {  
  9      private $host; //主机 
  10      private $user; //用户名 
  11      private $pwd; //密码 
  12      private $port; //端口 
  13      private $charset; //编码 
  14      private $dbname; //数据库 
  15  
  16      private $link=null; //存储数据库资源 
  17      private static $instance=null; //存储本类实例对象 
  18  
  19      /** 
  20       * 构造方法: 保存数据库连接信息,连接数据库 
  21       * @access private 
  22       * @param array $conf 数据库连接信息 
  23       */ 
  24      private function __construct($conf) 
  25      { 
  26          $this->host = !empty($conf['host']) ? $conf['host'] : 'localhost'; 
  27          $this->user = !empty($conf['user']) ? $conf['user'] : 'root'; 
  28          $this->pwd = !empty($conf['pwd']) ? $conf['pwd'] : 'root'; 
  29          $this->port = !empty($conf['port']) ? $conf['port'] : '3306'; 
  30          $this->charset = !empty($conf['charset']) ? $conf['charset'] : 'utf8'; 
  31          $this->dbname = !empty($conf['dbname']) ? $conf['dbname'] : 'web'; 
  32  
  33          $this->connect(); 
  34      } 
  35  
  36      /** 
  37       * 连接数据库,设置编码,选库 
  38       * @access private 
  39       */ 
  40      private function connect() 
  41      { 
  42          $this->link = @ mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd") or die('连接失败!'.mysql_error()); 
  43          $this->setCharset($this->charset); 
  44          $this->useDb($this->dbname); 
  45      } 
  46      /** 
  47       * 设置字符便 
  48       * @access public 
  49       * @param string $char 字符编码 
  50       */ 
  51      public function setCharset($char) 
  52      { 
  53          $this->query("set names $char"); 
  54      } 
  55      /** 
  56       * 选择数据库 
  57       * @access public 
  58       * @param string $dbname 数据库名称 
  59       */ 
  60      public function useDb($dbname) 
  61      { 
  62          $this->query("use $dbname"); 
  63      } 
  64  
  65      /** 
  66       * 执行sql语句 
  67       * @param  string $sql sql语句 
  68       * @return mixed 
  69       */ 
  70      private function query($sql) 
  71      { 
  72          $result = mysql_query($sql, $this->link); 
  73          if(false === $result) { 
  74              echo "<p>sql执行失败!<br>"; 
  75              echo "<br>失败语句:".$sql; 
  76              echo "<br>错误代号".mysql_errno(); 
  77              echo "<br>错误提示: ".mysql_error()."</p>"; 
  78              exit(); 
  79          } 
  80          return $result; 
  81      } 
  82  
  83      /** 
  84       *  获取本类实例 
  85       * @access public 
  86       * @param  array $conf 数据库连接信息 
  87       * @return  object     本类的单例对象 
  88       */ 
  89      public static function getDb($conf) 
  90      { 
  91          if(false === (static::$instance instanceof static)){ 
  92              static::$instance = new static($conf); 
  93          } 
  94          return static::$instance; 
  95      } 
  96      /** 
  97       * 禁止克隆 
  98       */ 
  99      public function __clone()
  100      {
  101      
  102      }
  103      /**
  104       * 关闭数据库连接
  105       * @access public
  106       */
  107      public function closeDb()
  108      {
  109          mysql_close($this->link);
  110      }
  111 
  112      public function exec($sql)
  113      {
  114          $result = $this->query($sql);
  115          return $this->affectedRows();
  116 
  117      }
  118      /**
  119       * 受影响的行数
  120       * @return int 返回受影响的行数
  121       */
  122      private function affectedRows()
  123      {
  124124          return mysql_affected_rows($this->link);
  125      }
  126 
  127      /**
  128       * 执行 “返回一行数据”的查询
  129       * @param  string $sql sql语句
  130       * @return array      一维数组(一行)
  131       */
  132      public function getOneRow($sql)
  133      {
  134          $result = $this->query($sql);
  135          $data = mysql_fetch_assoc($result);
  136          mysql_free_result($result);
  137          return $data;
  138      }
  139      /**
  140       * 执行 "返回多行数据" 的查询
  141       * @param  string $sql sql语句
  142       * @return array      二维数组
  143       */
  144      public function getAllRows($sql)
  145      {
  146          $result = $this->query($sql);
  147          $data = array();
  148          while($row = mysql_fetch_assoc($result)){
  149              $data[] = $row;
  150          }
  151          mysql_free_result($result);
  152          return $data;
  153      }
  154      /**
  155       * 执行“获取一个数据”的查询
  156       * @param  string $sql sql语句
  157       * @return mixed      标量数据值
  158       */
  159      public function getOneData($sql)
  160      {
  161          $result = $this->query($sql);
  162          $data = mysql_fetch_row($result);
  163          mysql_free_result($result);
  164          return $data[0];
  165      }
  166 
  167      /**
  168       * 上次insert时的自增长id值
  169       * @return int insert时的id值
  170       */
  171      public function getInsertId()
  172      {
  173          return mysql_insert_id($this->link);
  174      }
  175 
  176      /**
  177       * 序列化时,对指定数据进行序列化
  178       * @return array 指定进行序列化的数据
  179       */
  180      public function __sleep()
  181      {
  182          return array('host', 'port', 'user', 'pass','charset', 'dbname');
  183      }
  184      /**
  185       * 反序列化时,使用相应数据连接数据库
  186       */
  187      public function __wakeup()
  188      {
  189          $this->connect(); //连接数据库
  190      }
  191      /**
  192     * 自动生成insert语句或update语句
  193     * @param array      $data          insert或update的数据
  194     * @param  string     $table        操作的数据表
  195     * @param  string     $act           是update还是insert操作
  196     * @param  string     $where      where条件 如 id=2  如果是update必须加,否则不执行直接返回false
  197     * @return bool        执行insert与update的结果
  198     */
  199      public function autoExecute($data, $table, $act='insert', $where='')
  200      {
  201          if($act == 'insert') {
  202              $sql = "insert into ".$table."(";
  203              $sql .=implode(",", array_keys($data));
  204              $sql .= ") values ('";
  205              $sql .= implode("','", array_values($data));
  206              $sql .= "')";
  207 
  208              $res = $this->exec($sql);
  209               return $this->getInsertId();
  210 
  211          } else if($act == 'update') {
  212              if(!$where) { return false; }
  213              $sql = 'update '.$table.' set ';
  214              foreach ($data as $k => $v) {
  215                  $sql .= $k."='".$v."',";
  216              }
  217              $sql = substr($sql, 0, -1);
  218              $sql .= ' where '.$where;
  219 
  220              return $this->exec($sql);
  221          } else {
  222              return false;
  223          }
  224 
  225      }
  226  }

点击查看工具类

创建公共模型类和公共控制器类

  1) 公共模型类【Frame/BaseModel.class.php】  获取数据库操作工具类实例

 1 <?php
 2  
 3 /** 
 4  * BaseModel.class.php 基础模型类 
 5  *     连接数据库 
 6  */ 
 7 class BaseModel 
 8 { 
 9     protected $db = null;
 10     /**
 11      * 构造方法: 实例化数据库类
 12      * @access public13      * @param array $config  数据库配置信息
 14      */
 15     function __construct(array $config=null)
 16     {
 17         $conf = array(
 18             'host'=>'localhost',
 19             'user'=>'root',
 20             'pwd'=>'root',
 21             'port'=>'3306',
 22             'charset'=>'utf8',
 23             'dbname'=>'web',
 24         );
 25         $conf = empty($config)? $conf : array_merge($conf,$config);
 26         $this->db = Db::getDb($conf);
 27     }
 28 }

  2) 公共控制器类【Frame/BaseController】 :

    统一了编码

    提示信息跳转

 1 <?php 
 2 /** 
 3  * BaseController.class.php  公共控制器 
 4  * @author young 
 5  */ 
 6  
 7 class BaseController 
 8 { 
 9     /**
 10      * 统一编码utf8
 11      */
 12     public function __construct()
 13     {
 14         header("content-type:text/html;charset=utf-8");
 15         session_start();
 16     }
 17 
 18     /**
 19      * 跳转提示
 20      * @access public
 21      * @param  string  $msg  跳转提示信息
 22      * @param  string  $url  跳转的地址
 23      * @param  integer $time 等待时间 秒数
 24      */
 25     public function msg($msg='', $url='?', $time=3)
 26     {
 27         echo "<p><a href='$url'>返回</a></p>页面将在{$time}秒之后跳转!!";
 28         header("refresh: $time; url=$url");
 29         exit("<p><span style='color:red'>$msg</span></p>");
 30     }
 31 }

  3)入口文件中引入工具类,基础模型和基础控制器类

  【index.php】

 1 <?php 
 2 /** 
 3  * 入口文件 
 4  */
 5 require_once 'Frame/Db.class.php'; 
 6 require_once 'Frame/BaseModel.class.php'; 
 7 require_once('Model/UserModel.class.php'); 
 8 require_once 'Frame/BaseController.class.php'; 
 9 require_once 'Controller/UserController.class.php';
 10 
 11 //实例化控制器
 12 $userCtr = new UserController();
 13 
 14 $a = !empty($_GET['a']) ? $_GET['a'] : 'login';
 15 
 16 $userCtr -> $a();

点击查看入口文件

  4)用户模型类优化 【Model/UserModel.class.php】

 1 <?php 
 2  
 3 /**
 4  * UserModel.class.php 
 5  *     用户模型类-操作表pbg_users 
 6  */ 
 7 class UserModel extends BaseModel 
 8 { 
 9     /**
 10      * 检验登录信息
 11      * @param  array $data 用户提交的登录信息
 12      * @return bool       true-校验成功 false-校验失败
 13      */
 14     public function checkLoginInfo($data)
 15     {
 16         $sql = "select id,username,pwd from pbg_users where username='{$data['username']}'";
 17         $res = $this->db->getOneRow($sql);
 18         return $res['pwd'] == md5($data['pwd']) ? : false;
 19     }
 20 }

  5) 用户控制器登录操作,跳转提示优化

    使用公共控制器方法msg()

 1 。。。。。。。 
 2     /** 
 3      * 登录操作: 校验登录信息 
 4      */ 
 5     public function dlogin() 
 6     { 
 7         //接收登录信息 
 8         $data = array(); 
 9         $data['username'] = trim($_POST['username']);
 10         $data['pwd'] = trim($_POST['pwd']);
 11 
 12         //实例化模型,调用模型方法
 13         $model = new UserModel();
 14         $result = $model->checkLoginInfo($data);
 15         //跳转提示
 16         if($result){
 17             $this->msg('登录成功!', '?a=index',3);
 18         } else {
 19             $this->msg('用户名或密码不正确!!');
 20         }
 21     }

合并保存并推送git

1 $ git add -A
2 $ git commit -m "MVC结构,数据库操作类,基础模型类和基础控制器类制作"
3 $ git checkout master
4 $ git merge mvc-dbtools-base
5 $ git push origin master

小结: 优化目录结构,制作数据库操作类,基础模型类与基础控制器类使用

下一步: 模型类实现单例, 进一步优化目录结构,区分平台(如前台,后台)

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

浅谈PHP源码五:关于array 数组的创建

浅谈PHP源码一:explode和implode函数

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

21

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

106

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

50

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

87

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

27

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

61

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

50

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号