批改状态:合格
老师批语:其实代码并不多, 但是其中的套路很有意思 , 值得多多体会
- M: Model, 模型, 数据库的操作
- V: View, 视图, 页面, html
- C: Controller, 控制器
- 仿站: V - M - C
- 自主: M - V - C
<?php// 模型: 当前页面要显示的数据$pdo = new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'melinda123');$users = $pdo->query('select * from users limit 10')->fetchAll(PDO::FETCH_ASSOC);?><!-- 视图 --><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>用户列表</title></head><body><table border="1" width="60%"><caption>用户表</caption><tr><th>id</th><th>name</th><th>email</th></tr><!-- 渲染数据,用横版语法 --><?php foreach ($users as $user): ?><tr><td><?=$user['id']?></td><td><?=$user['name']?></td><td><?=$user['email']?></td></tr><?php endforeach ?></table></body></html>
<?phpnamespace mvc_demo;use PDO;// 模型: 数据库操作class Model{// 获取数据public function getData(){return (new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'melinda123'))->query('select * from users limit 10')->fetchAll(PDO::FETCH_ASSOC);}}
<?phpnamespace mvc_demo;// 视图: 数据展示class View{// 数据展示public function fetch($data){// 表格方式展示,使用字符串拼接实现table的html代码$table = '<table>';$table .= '<caption>用户信息表</caption>';$table .= '<tr><th>ID</th><th>用户名</th><th>邮箱</th></tr>';// 遍历用户表foreach ($data as $user){$table .= '<tr>';$table .= '<td>'.$user['id'].'</td>';$table .= '<td>'.$user['name'].'</td>';$table .= '<td>'.$user['email'].'</td>';$table .= '</tr>';}$table .= '</table>';return $table;}}echo '<style>table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}caption {font-size: 1.2rem; margin-bottom: 10px;}tr:first-of-type { background-color:yellow;}td,th {border: 1px solid; padding:5px}</style>';
<?php// 控制器1namespace mvc_demo;// 加载模型类require 'Model.php';// 加载视图类require 'View.php';class Controller1{// 获取数据,并展示出来public function index(){// 1. 获取数据// 生成模型$model = new Model();// 调用方法$data = $model->getData();// 2. 渲染模板$view = new View();return $view->fetch($data);}}// 客户端调用(测试)// 创建控制器实例/对象$controller = new Controller1();echo $controller->index();
<?php// 控制器5: Facade门面技术, 静态接管服务容器中的成员的访问namespace mvc_demo;use Closure;// 加载模型类require 'Model.php';// 加载视图类require 'View.php';// 服务容器class Container2{// 1. 对象容器protected $instances = [];// 2. 向对象容器中添加对象// 参数1: 是外部对象在当前对象容器数组中的键名/别名// 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)public function bind($alias, Closure $process){$this->instances[$alias] = $process;}// 3. 从对象容器中取出对象, 调用它public function make($alias, $params=[] ) {return call_user_func_array($this->instances[$alias], []);}}// 将外部对象: Model, View的实例绑定到服务容器中$container = new Container2;// 绑定模型类实例绑定到服务容器中$container->bind('model', function(){return new Model();});// 绑定视图类实例绑定到服务容器中$container->bind('view', function(){return new View();});// 在服务容器与工作的控制器之间再添加一个中间层: Facadeclass Facade{// 服务容器protected static $container = null;// 初始化方法: 就是给当前的Facade类扣$container属性赋值// 将外部的服务容器注入到当前的facade中public static function initialize(Container2 $container){// 赋值static::$container = $container;}}// 模型类成员访问静态化(给成员套一个静态访问的马甲)class UserModel extends Facade{public static function getData(){return static::$container->make('model')->getData();}}// 视图类成员访问静态化(给成员套一个静态访问的马甲)class UserView extends Facade{public static function fetch($data){return static::$container->make('view')->fetch($data);}}class Controller5{// 构造方法,初始化facadepublic function __construct(Container2 $container){// 调用facade的containerFacade::initialize($container);}// 用Facade方式类成员public function index(){// 1. 获取数据$data = UserModel::getData();// 2. 渲染模板return UserView::fetch($data);}}// 客户端调用(测试)$controller = new Controller5($container);echo $controller->index();1.服务容器Container22.将外部对象: Model, View的实例绑定到服务容器中3.中间层: Facade4.外部服务容器注入到当前的facade中5.视图类成员访问静态化,静态访问马甲UserModel6.视图类成员访问静态化,静态访问马甲UserView7.工作控制器Controller5
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号