Correcting teacher:PHPz
Correction status:qualified
Teacher's comments:
配置文件代码如下:
<?php
// 数据库连接参数
define('DATABASE',[
'type' => 'mysql',
'host' => 'localhost',
'dbname' => 'phpedu',
'port' => '3306',
'charset' => 'utf8',
'username' => 'root',
'password' => 'root'
]);
// 应用相关
define('APP', [
// 默认控制器
'default_controller' => 'index',
// 默认方法
'default_action' => 'index'
]);
// 项目根路径
define('ROOT_PATH', __DIR__);
创建框架核心类库core,将Model.php、View.php、Controller.php一并放入core目录中,好方便管理
模型类文件代码如下:
<?php
namespace phpcn;
use PDO;
class Model
{
// 连接对象
// * protected表示受保护的,只有本类或子类或父类中可以访问
protected $db;
// * 模型实例化时,应该将数据库连接上,为后面的操作做好准备
public function __construct($dsn,$username,$password)
{
$this->db = new PDO($dsn,$username,$password);
}
// 通常模型类中,会预置一些公共方法,供用户进行数据库操作
// 获取分布数据(多条)
public function getAll($n = 10)
{
$stmt = $this->db->prepare('SELECT * FROM `staff` LIMIT ?');
// 默认绑定的都是字符串类型
// 1代表一个问号,$n代表要绑定的变量,PDO::PARAM_INT表示值为整型
$stmt->bindParam(1,$n,PDO::PARAM_INT);
$stmt->execute();
// * 下面这条语句用来解析调试的
// print_r($stmt->debugDumpParams());
return $stmt->fetchAll();
}
}
视图类文件代码:
<?php
namespace phpcn;
class View
{
public function display($data)
{
// 1. 模型赋值
$staffs = $data;
// 2. 渲染模型
include ROOT_PATH . '/view/' . 'show.php';
}
}
控制器类文件代码
<?php
namespace phpcn;
class Controller
{
// 模型对象
protected $model;
// 视图对象
protected $view;
// 控制器类实例时,要确保模型和视图对象可用
public function __construct($model,$view)
{
$this->model = $model;
$this->view = $view;
}
public function index()
{
// 1. 模型:获取数据
$data = $this->model->getAll(5);
// print_r($data);
// 2. 视图:渲染模板
$this->view->display($data);
}
}
<?php
namespace phpcn;
class StaffModel extends Model
{
// 复用
}
### 视图模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>员工管理系统</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="5" width="400">
<caption style="font-size: 1.2em;">员工信息表</caption>
<thead bgcolor="lightcyan">
<tr>
<th>id</th>
<th>姓名</th>
<th>性别</th>
<th>邮箱</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php foreach ($staffs as [$id,$name,$sex,$email]) : ?>
<tr>
<td><?= $id ?></td>
<td><?= $name ?></td>
<td><?= $sex ? '女' : '男' ?></td>
<td><?= $email ?></td>
<td>
<a href="">编辑</a>
<a href="">删除</a>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
</body>
</html>
<?php
namespace phpcn;
// 加载配置项
require __DIR__ . '/config.php';
// 加载框架的核心类型
require __DIR__ . '/core/Controller.php';
require __DIR__ . '/core/Model.php';
require __DIR__ . '/core/View.php';
// 加载自定义模型
require __DIR__ . '/model/StaffModel.php';
// 将关联数组解构成一个个独立变量
extract(DATABASE);
// echo $type;
// 实例化模型类
$dsn = sprintf('%s:dbname=%s', $type, $dbname);
$model = new StaffModel($dsn, $username, $password);
// https://php.edu/0506/mvc3/index.php?c=controller&a=action
// c=控制器, a=控制器的方法
$c = $_GET['c'] ?? APP['default_controller'];
$a = $_GET['a'] ?? APP['default_action'];
// echo $c,$a;
// 获取类名
$class = ucfirst($c) . 'Controller';
// 加载自定义控制器类
require __DIR__ . '/controller/' . $class . '.php';
// 加载视图类
$view = new View();
// 完整控制器类名
// echo $class;
// echo __NAMESPACE__ . '\\' . $class;
$fullclass = __NAMESPACE__ . '\\' . $class;
$controller = new $fullclass($model, $view);
// 执行控制器中的index()
echo $controller->$a();
以上就是一个简单的MVC实例演示,运行index.php后效果如图: