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  $a();

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

 1 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() 检验用户名和密码

查看用户模型类

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

    引入路径的修正,

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

 1  
 2  
 3  
 4      
 5     登录 
 6      
 7      
 8  
 9 
 10 

11

12

13

14

登录

15


16 17

18 19

20 21

22

23 24

25 26

27 28

29

30 31

32

33 34 35

36

37
38

39

40 41 46 47

点击查看登录视图源码

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

数据库工具类制作

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

实现单例

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

剪映
剪映

一款全能易用的桌面端剪辑软件

下载

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

【Frame/Db.class.php】

  1 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 "

sql执行失败!
"; 75 echo "
失败语句:".$sql; 76 echo "
错误代号".mysql_errno(); 77 echo "
错误提示: ".mysql_error()."

"; 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 '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 返回

页面将在{$time}秒之后跳转!!"; 28 header("refresh: $time; url=$url"); 29 exit("

$msg

"); 30 } 31 }

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

  【index.php】

 1  $a();

点击查看入口文件

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

 1 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不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

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

精品课程

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

共21课时 | 3.2万人学习

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

共13课时 | 0.9万人学习

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号