1. 写一个依赖注入的案例, 内容自定义
2. 写一个mvc应用的案例, 内容自定义
3. 写一个简单的路由, 理解路由的原理与目标
课程笔记:
* 单例模式
* 1. 一个类, 仅允许实例化一次, 即允许创建一个实例
* 2.应用场景: 数据库的连接对象,HTTP请求,游戏中的主角...
* clone可以克隆出全新的对象
工厂模式:批量生产对象
M: Model, 模型, 数据, 主要针对的是数据库的操作, CURD
V: View, 视图, html文档,浏览器用户看到内容/页面
C: Controller, 控制器, 模型和视图都必须在控制器中调用
代码最好做到高内聚低耦合
// 将Model和View的类实例, 作为参数,注入到控制器的方法中
// 这就叫:依赖注入
explode — 使用一个字符串分割另一个字符串
array_slice — 从数组中取出一段
clone 可以克隆对象
eg: $obj3 = clone $obj2;
控制器中的构造方法可以简化代码
:在一个类中我们在构造方法中初始化的属性我们可以用到该类的所有方法中 实现参数的共享
依赖注入更好的方法是构造方法
服务容器:将对象的创建和使用过程统一管理起来。对象的管理器,把对象的实例化放在容器中,然后把对象从容器中取出来。
门面模式(facade):把调用代码静态化。
依赖注入案例
<?php /** * MVC思想 * 任务: 将商品信息展示出来 */ // 加载: 模型类 require 'Model.php'; // 加载: 视图类 require 'View.php'; // 控制器 class Controller { public function index(Model $model, View $view) { // 1. 获取数据 $data = $model->getData(); // 2. 渲染模板/视图 return $view->fetch($data); } } // 客户端调用控制器 // 将模型与视图的实例化过程 放在控制器的外部实现 $model = new Model(); $view = new View(); $controler = new Controller(); // 将Model和View的类实例, 作为参数,注入到控制器的方法中 // 这就叫:依赖注入 //注入点: //1. 控制器中的普通方法 //2. 控制器中的构造方法 echo $controler->index($model, $view);
运行效果图 :
写一个mvc的小案例
Model.php
<?php class Model{ public function getData(){ $dsn = "mysql:host=127.0.0.1;dbname=php"; $username = "root"; $password = "123456"; $pdo = new PDO($dsn,$username,$password); $sql = "select * from `staff`"; $stmt = $pdo->prepare($sql); $stmt->execute(); $array = $stmt->fetchAll(PDO::FETCH_ASSOC); return $array; } }
View.php
<?php class View{ public function fetch($data){ $table = '<table border="1" cellspacing="0" width="800" >'; $table .= '<caption>人民的名义信息表</caption>'; $table .= '<tr bgcolor="lightblue"><th>ID</th><th>姓名</th><th>年龄</th><th>性别</th><th>职位</th><th>手机</th><th>入职日期</th></tr>'; foreach ($data as $product) { if($product['sex']==1){ $product['sex'] = '男'; }else{ $product['sex'] = '女'; } $product['hiredate'] = date('Y年m月d日',$product['hiredate']); $table .= '<tr>'; $table .= '<td align="center">' . $product['staff_id'] . '</td>'; $table .= '<td align="center">' . $product['name'] . '</td>'; $table .= '<td align="center">' . $product['age'] . '</td>'; $table .= '<td align="center">' . $product['sex'] . '</td>'; $table .= '<td align="center">' . $product['position'] . '</td>'; $table .= '<td align="center">' . $product['mobile'] . '</td>'; $table .= '<td align="center">' . $product['hiredate'] . '</td>'; $table .= '</tr>'; } $table .= '</table>'; return $table; } }
运行效果图
运用依然是demo1的代码
运行效果
写一个简单的路由, 理解路由的原理与目标
<?php
//路由的原理
// http://php.cn:9096/1011/mvc/route.php
// 1. 从url 路径中解析出独立的单元
$uri = $_SERVER['REQUEST_URI'];
echo $uri;
$req = explode('/', $uri);
echo '<pre>'. print_r($req, true);
//admin: 后台模块
//User: 控制器
//add: 控制器中的方法
$route = array_slice($req, 4, 3);
echo '<pre>'. print_r($route,true);
list($module, $controller, $action) = $route;
echo '模块:'.$module.'<br>控制器:'.$controller. '<br>操作: '. $action;
//http://php.cn:9096/1011/mvc/route.php/admin/user/add/name/wanwu/age/36/salary/9988
// /name/wanwu/age/36/salary/9988:参数
$valus = array_slice($req,7,6);
echo '<pre>'. print_r($valus, true);
for ($i=0; $i<count($valus); $i+=2){
$params [$valus[$i]] = $valus[$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);
?>
运行效果
如图