Correction status:qualified
Teacher's comments:课堂上用最简单的案例演示了常用的几个设计 模式, 一定要深刻的理
1 写一个依赖注入的案例, 内容自定义
Model.php文件
<?php //模型类:操作数据库 class Model { public function getData() { return [ ['id'=>1, 'name'=>'苹果电脑','model'=>'MacBook Pro','price'=>25800], ['id'=>2, 'name'=>'一加手机','model'=>'Pro','price'=>4600], ['id'=>3, 'name'=>'小度同学','model'=>'AI音箱','price'=>199], ]; } }
点击 "运行实例" 按钮查看在线实例
View.php文件
<?php //视图类:渲染数据 class View { public function fetch($data) { $table = '<table border="1" cellspacing="0" width="400">'; $table .= '<caption>商品信息表</caption>'; $table .= '<tr bgcolor="lightblue"><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>'; foreach($data as $product){ $table .= '<tr>'; $table .= '<td>' . $product['id'] . '</td>'; $table .= '<td>' . $product['name'] . '</td>'; $table .= '<td>' . $product['model'] . '</td>'; $table .= '<td>' . $product['price'] . '</td>'; $table .= '</tr>'; } $table .= '</table>'; return $table; } }
点击 "运行实例" 按钮查看在线实例
demo1.php文件(依赖注入)
<?php /** * MVC思想 * 任务: 将商品信息展示出来 * 将依赖注入点放在控制器中的构造方法中 */ require_once 'Model.php'; require_once 'View.php'; //控制器 class Controller { private $model = null; private $view = null; public function __construct($model, $view) { $this->model = $model; $this->view = $view; } public function index() { $data = $this->model->getData(); return $this->view->fetch($data); } } //将模型和视图的实例化过程 放在控制器的外部实现 $model = new Model(); $view = new View(); $controller = new Controller($model,$view); //依赖注入:将model和view的类实例,作为参数,注入到控制器的方法中 //注入点: //1、控制器中的普通方法 //2、控制器中的构造方法 echo $controller->index();
点击 "运行实例" 按钮查看在线实例
2 写一个mvc应用的案例, 内容自定义
提前准备文件:
View.php
Model.php
控制器文件:
demo2.php
<?php /** * MVC思想 * 任务: 将商品信息展示出来 * 创建服务容器(简称容器),将对象的创建与使用过程统一管理起来 * 门面Facade,外观模式,静态代理 */ require_once 'Model.php'; require_once 'View.php'; //创建服务器容器,对象管理器 class Container { //创建容器池/数组 protected $instance = []; //实现类实例的实例化,并保存到一个数组中 public function bind($alias, Closure $process) { //将类的实例化过程绑定/存入到容器中 $this->instance[$alias] = $process; } //将类实例取出来 public function make($alias, $params=[]) { return call_user_func_array($this->instance[$alias], []); } } //将模型和视图绑定到服务容器中 $container = new Container(); //将模型绑定到容器中,起一个别名:model $container->bind('model', function () { return new Model(); }); //将视图绑定到容器中,起一个别名:view $container->bind('view',function(){ return new View(); }); //门面Facade,外观模式,静态代理 class Facade { //容器对象 protected static $container = null; //保存模型中的数据 protected static $data = []; //初始化方法,用来给容器对象赋值 public static function initialize(Container $container) { static::$container = $container; } //给获取模型数据的getData()方法套一个静态马甲,静态代理 public static function getData() { static::$data = static::$container->make('model')->getData(); } //将渲染视图的fetch()方法套一个静态马甲,静态代理 public static function fecth() { return static::$container->make('view')->fetch(static::$data); } } //声明一个商品类 class Product extends Facade { //... } //控制器 class Controller { //构造方法 public function __construct(Container $container) { Product::initialize($container); } //将容器对象注入到index() public function index() { //1、获取数据 Product::getData(); //2、渲染模板/视图 return Product::fecth(); } } //客户端调用控制器 $controller = new Controller($container); echo $controller->index();
点击 "运行实例" 按钮查看在线实例
3 写一个简单的路由, 理解路由的原理与目标
<?php //路由原理 //1、从url路径中解析出独立 的单元 $url = $_SERVER['REQUEST_URI']; echo $url; $req = explode('/', $url); echo '<pre>' . print_r($req, true); //admin: 后台模块 //user:控制器 //add:控制器中的方法 //array_slice:(数组,索引,取多少位) $route = array_slice($req, 5, 4); echo '<pre>' . print_r($route, true); //list:(分别给value赋变量) list($module, $controller, $action) = $route; echo '模块:' .$module. '<br />控制器:' .$controller. '<br />操作:' .$action; ///02_php/1011/mvc/demo5.php/admin/user/add/name/peter/age/36/salary/9988 ///name/peter/age/36/salary/9988:参数 $values = array_slice($req,8,6); echo '<pre>' . print_r($values, true); for($i=0; $i<count($values);$i+=2){ $params[$values[$i]] = $values[$i+1]; } echo '<pre>' . print_r($params, true); //控制器 class User { public function add($name,$age,$salary) { return __METHOD__ . ':姓名:' . $name . ',年龄:' .$age. ',工资:' .$salary; } } //路由的目标,就是将URL中的操作映射到控制器中的方法上 echo call_user_func_array([(new User()), 'add'], $params); //路由: //几个重点单词: //1、 //$url = $_SERVER['REQUEST_URI']; //读取从url路径中解析出独立 的单元 //2、array_slice(数组,索引,取多少位) //3、list($module, $controller, $action) = $route; //分别给values赋变量名称 //原理: //1、先获取url单元,拆分模块以及参数 //2、循环参数后赋值数组上即可 //3、路由目标,可用call_user_func_array()函数映射到控制器中的方法上
点击 "运行实例" 按钮查看在线实例
小结:
1、依赖注入:可将模型和视图的实例化过程,放在控制器的外部实现;作为参数,注入到控制器的方法中
2、MVC:
Model:数据库操作类
View:视图类
Controller:控制类
2.1 在原有基础上,创建服务器容器,对对象的管理,将模型和视图绑定到服务容器中,调用;
2.2 门面Facade,将控制器方法套上静态马甲
2.3 控制方法,构造方法,获取容器(门面Facade),调用方法,获取数据
3、路由原理以及目标
//路由:
//几个重点单词:
//1、
//$url = $_SERVER['REQUEST_URI'];
//读取从url路径中解析出独立 的单元
//2、array_slice(数组,索引,取多少位)
//3、list($module, $controller, $action) = $route;
//分别给values赋变量名称
//原理:
//1、先获取url单元,拆分模块以及参数
//2、循环参数后赋值数组上即可
//3、路由目标,可用call_user_func_array()函数映射到控制器中的方法上