MVC(模型,视图,对照)总而言之即逻辑与数据相分离,把数据部分和前台显示部分分离开来,而每个模块又有着自己的任务部分,多人编程的情况下各自负责各自的部分,项目完工时直接合并就可以了。MVC思想如下图:
最简单的代码逻辑演示如下:
如图1所示,数据库工具操作类,用来操作数据库。此类可以实现数据库的连接,和数据库的操作等封装方法。(这个文件在我本地的路径是类里面的,如果直接拷贝的时候注意路径问题)
<?php
header('content-type:text/html;charset=utf-8');
error_reporting(E_ALL ^ E_DEPRECATED);
class MYSQL{
private $link=null;
private $host;
private $port;
private $user;
private $pass;
private $char;
private $db;
// 添加单例模块
private static $instance=null;
static function GetInstance($config){ // 获取对象
$obj=new self($config);
if(!isset(self::$instance))
{
self::$instance=new self($config); //判断如果instance为空则新建一个对象 然后存到静态属性instance里面
} return self::$instance; //如果静态属性instance中已经有了对象则直接返回即可
}
private function __clone(){
} // 私有化克隆方法,防止外界通过克隆手段来重新生成对象
// 单例模块结束
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->pass=!empty($config['pass']) ? $config['pass'] : "";
$this->char=!empty($config['char']) ? $config['char'] : "utf8";
$this->db=!empty($config['db']) ? $config['db'] : "test";
$link=@mysql_connect("{$config['host']}:{$config['port']}","{$config['user']}","{$config['pass']}");
$this->charset($this->char);
$this->usedb($this->db);
}
function charset($charset){ // 设置字符编码
mysql_query("set names {$charset} ");
}
function usedb($db){ //更改要使用的数据库
mysql_query("use {$db}");
echo "已切换数据库 {$db} <br>";
}
function closeDB(){ //关闭数据库
mysql_close($this->link);
echo "已关闭数据库连接";
}
function exec($sql){ // 返回增,删,改语句的返回值为真假boolen
$result=$this->query($sql);
return true; //因为是增删改语句,所以直接返回true就行了
}
function getOneRow($sql){ //执行一条返回一行数据的语句,返回一维数组
$result =$this->query($sql); // 一行代替几行代码
$arr=mysql_fetch_assoc($result);
mysql_free_result($result);// 提前释放连接资源 释放内存空间(销毁结果集),否则等到页面结束才自动销毁 这是PHP语言的一个优势
return $arr;
}
function getRows($sql){ // 执行一条返回多行数据的语句,返回二维数组
// $result = mysql_query($sql);
$result=$this->query($sql);
$array=array();
while ($arr=mysql_fetch_assoc($result)) {
# code...
$array[]=$arr; // 此时就为二维数组了
}
return $array;
}
function getOnedata($sql){ //执行一条返回一个数据的语句,返回一个直接值
$result=$this->query($sql);// 一行代替上面几行
$arr=mysql_fetch_row($result);
$data=$arr[0]; // 因为只取出一行,所以直接取出索引为0的数组即可了
return $data;
}
function query($sql){ // 仅仅用于执行sql语句,然后直接返回sql执行的结果
$result=mysql_query($sql);
if($result===false){
echo "数据执行失败";
echo "请参考如下信息:".mysql_error();
die();
}echo "数据执行成功";
return $result;
}
}
?>
2,模型类。用以提取数据库中的数据。这里我的数据库用的是测试,密码是空,在数据库中自己可以设置 .showInfo()和showUsers()方法是模型类的方法,在控制器类文件里调用这两个方法来:.MYSQL ::的GetInstance()这个方法是调用的数据库类生产,以上在类文件中已做静态化处理仅仅的英文个类文件,单独访问不会有结果,需载入控制器类文件中。
总结:
模型类不能直接请求,只能“被载入”而发挥作用。
通常都是根据“控制器的要求”,以返回合适的数据;
它的核心工作只有一个:
(根据控制器的要求)去生产数据;
<?php
// 模型类主要用于操作提供数据
require './class/MYSQL.class.php';
class model { // 此类实现数据库的简单查询操作
private $config=array(
'host'=>"localhost",
'port'=>3306,
'user'=>"root",
'pass'=>'', // 自己的数据库密码
'char'=>"utf8", // 自己的数据库编码
'db'=>"test" //自己的数据库名字
);
function showInfo(){ // 用来显示所有数据
$sql="select * from stu;";
$obj=MYSQL::GetInstance($this->config);
$data=$obj->getRows($sql); // 返回值为父类的 方法的 返回值 是个数组
return $data;
}
function showUsers(){ // 返回总共有多少条记录
$sql="select count(*) from stu;";
$obj=MYSQL::GetInstance($this->config);
$data=$obj->getOnedata($sql);
return $data;
}
}
3,控制器类,用以给浏览器请求,然后决定用哪里的数据显示到(test_model.html)上。
忘记不要了需要加载模型类文件视图状语从句:层视图文件。
总结:
控制器类由浏览器直接请求(访问);
它需要做2件最核心的工作:
1,(根据请求),决定需要什么数据,并去调用模型文件(类),去获取该数据;
2,(根据请求),决定需要将数据显示在哪个视图文件中。
<?php
require '模型类文件';
$obj=new model();
$users_info=$obj->showInfo();
$users=$obj->showUsers();
include './test_model.html'; //加载当前文件下的test_model.html视图层文件
?>
如图4所示,视图层文件。仅用来显示PHP数据填充后的样子,单独访问不会有结果。
总结:
View,是一个“伪html文件”(因为其中有极简单的php代码),它也不应由浏览器直接请求;
它的作用是:
结合html和css代码,显示相应的变量(数据)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
view层出来了,数据如下:
<br>
<table border="1">
<?php
// echo var_dump($users_info);
// echo var_dump($users);
foreach($users_info as $value){
?>
<tr>
<td><?php echo $value['id']; ?> </td>
<td><?php echo $value['name']; ?> </td>
<td> <?php echo $value['gender']; ?></td>
</tr>
<?php } ?>
</table>
总人数有:<?php echo $users; ?> 个人 </body>
</html>
代码执行后如下,以上文件可以直接拷贝运行,但是请注意更改为自己的路径: