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()函数映射到控制器中的方法上
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号