容器注入: // 容器,和 facade 门面 都是类,用于分配参数和方法,放在controller中,调用model和向view返回数据
// 容器用来存放 调用过程, //门面是用 静态方法 向容器内传递 参数, 减少 new,
// 容器是用于存放对象创建方法的类,用于管理对象,门面是指容器的静态调用注入方案,
实例如下: 用闭包函数设计对象创建过程,
// 自行设计 用方法 设计 对象创建过程 在数组赋值后 调用失败
// 直接make 中提供new 变量 尝试成功 不需要bind 方法,直接传递 new类和参数
$a = __NAMESPACE__ . '\\' .$name; 需要加入空间名称才可以new成功
return call_user_func_array([(new $a()),$b], [$arguments]);}
mvc结构 : // view 向controlle发送指令和参数, controller判断参数 指向,调用 modle方法,并传递参数
// model 处理参数,整理正确的参数 并返回相关数据和信息 给controller
// controller 获取信息后 向view中传递数据
实例如下: 电影信息列表 mvc的分离设计
路由分拆:是对url地址进行分拆到数组,获取相关数据的过程,主要使用以下三个函数
$_SERVER['REQUEST_URI'] 获取url函数
explode() 字符串分割,根据符号分割字符串到数组中
array_slice()数组分离,根据位置分离部分数组内容
实例如下:有get传值的url 地址分拆
容器注入实例
// 容器,创建一个数组,将对象的创建 对应到相关的 键与值中 并将对象返回
class container1011
{
public $classarr = []; // 给定一个类数组,存放类对象
public function bind($name, Closure $process) // 给外部调用使用, 绑定一个对象到对象数组中,closure 指定参数为函数类别
{
$this->classarr[$name] = $process;
}
public function make($name, $arguments = []) // 返回一个 先bind 过的对象 到调用者;
{
return call_user_func_array($this->classarr[$name], []);
}
}
$container = new Container1011(); // 设计model和view对象创建方法 用于注入
$container->bind('Dbop', function () { return new Dbop();}); // 将模型model类的对象创建方法绑定到容器中, 起一个别名: Dbop
$container->bind('view', function () { return new View();}); // 将视图绑定到容器中, 起一个别名: view一个简单的mvc结构实例
效果图:

controller.php 代码实例
<?php
namespace _101101;
include '../model/1011mvc_model.php'; // 控制器中 加载model方法库
include '../view/1011mvc_view.php'; // 控制器中 加载view方法 显示数据
interface idb_conf // 定义一个 公共配置 信息 接口
{
const DNS = 'mysql:host=127.0.0.1;dbname=app.io';
const USER = 'root';
const PASSWORD = 'root123456';
}
// 以下是 controller 控制器,负责控制调用 model 和向view 返回数据
class container1011 // 容器
{
public $classarr = []; // 对象数组
public function bind($name, Closure $process) // 给外部调用使用,绑定一个对象到对象数组中的方法
{
$this->classarr[$name] = $process;
}
public function make($name, $arguments = []) // 返回一个 先bind 过的对象 到调用者的方法
{
return call_user_func_array($this->classarr[$name], []);
}
}
$container = new Container1011(); // 创建容器
$container->bind('Dbop', function () { return new Dbop(); }); // 将模型model对象创建方法绑定到容器中, 起一个别名: Dbop
$container->bind('view', function () { return new View(); }); // 将视图绑定到容器中, 起一个别名: view
class controller //控制器类
{
public function run($container, $param) // 调用方法定义
{
$a = $param['action']; // 获取 动作方法参数
$data = $container->make('Dbop')->$a($param); // 调用容器内创建的model对象,并向对象内的方法传递参数,及获取返回值
return $container->make('view')->display($data); //调用容器内创建的view对象,并向对象内的方法传递参数
}
}
// 位置及按钮提供的 get 或 post 数组参数,
$param = [
'table' => 'movies', //当面位置的指定表
'action' => 'find', // 方法
'where' => '', //条件
'field' => '*' // 字段
];
$a = new controller(); // 创建控制器
echo $a->run($container, $param); // 运行相关方法model.php 代码实例
<?php
namespace _101101; // model 方法库, 调用获取数据的方法
class new_pdo implements idb_conf // newpdo 方法
{
protected static $pdo = ''; // PDO 连接方法
public static function linkdb() // 类中的静态属性赋值 为 pod 对象,连接接口中的常量值
{
return self::$pdo = new \PDO(idb_conf::DNS, idb_conf::USER, idb_conf::PASSWORD);
}
interface idbinfo_fanu // 定义一个数据库操作 接口
{
public function table($tablename);
public function field($fieldname);
public function where($wherename);
public function limit($limitname);
public function orderby($orderbyname);
public function select();
public function insert($name,$data);
public function update($name);
public function delete($name);
}
class Dbinfo implements idbinfo_fanu // 定义数据操作方法,从属 接口 idbinfo_fanu
{
public function table($tablename) //设置表名方法 // 给table属性赋值 // 返回对象
{
$this->table = $tablename;
return $this;
}
public function field($fieldname) //设置字段名方法 // 给field属性赋值,没有传值为空,有传值进行赋值 // 返回对象
{
$this->field = empty($fieldname) ? '*' : $fieldname;
return $this;
}
public function where($wherename) //设置条件方法 // 给where属性赋值,没有传值为空,有传值进行赋值// 返回对象
{
$this->where = empty($fieldname) ? '' : ' WHERE ' . $wherename;
return $this;
}
public function limit($limitname) //设置数量方法// 给limit属性赋值,没有传值为空,有传值进行赋值 // 返回对象
{
$this->limit = empty($fieldname) ? '' : ' LIMIT ' . $limitname;
return $this;
}
public function orderby($orderbyname) //设置排序方法// 给orderby属性赋值,没有传值为空,有传值进行赋值//返回对象
{
$this->orderby = empty($fieldname) ? '' : ' ORDER BY ' . $orderbyname;
return $this;
}
public function select() //设置 查询 mysql语句拼接
{
$sql = 'SELECT '. $this->field . ' FROM ' . $this->table . $this->where. $this->orderby . $this->limit;
$stmt = new_pdo::linkdb()->prepare($sql); // new pdo并预处理sql语句
$stmt->execute(); // 执行sql语句
return $stmt->fetchAll(\PDO::FETCH_ASSOC); // 向外返回结果
}
// 新增 更新 删除 已完成,代码略
}
class Dbop // 参数整理类
{
public $tablename = null;
public $fieldname = null;
public $wherename = null;
public $limitname = null;
public $orderbyname = null;
public function find($param) // 参数整理方法及执行查询操作
{
// 分配数组参数
if (is_array($param)) {
foreach ($param as $k => $v) {
switch ($k) {
case 'field': // 字段名
$this->fieldname = $v;
break;
case 'where': // 条件
$this->wherename = $v;
break;
case 'limit': // 数量
$this->limitname = $v;
break;
case 'orderby': // 排序方式
$this->orderbyname = $v;
break;
case 'table': // 表名
$this->tablename = $v;
break;
default:
break;
}
}
}
$a=new Dbinfo(); // 调用sql语句方法 //可以改用静态方法调用,需要加一个父类
return $a->table($this->tablename)
->field($this->fieldname)
->where($this->wherename)
->limit($this->limitname)
->orderby($this->orderbyname)
->select(); // 链式调用传叁及返回结果
}
}
?>view.php 代码实例
<?php
namespace _101101;
class view{
public function display($data) // 拼装html代码的方法
{
$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></tr>';
foreach ($data as $product) {
$table .= '<tr>';
$table .= '<td width="30px">' . $product['mov_id'] . '</td>';
$table .= '<td width="70px">' . $product['cate_id'] . '</td>';
$table .= '<td width="130px">' . $product['name'] . '</td>';
$table .= '<td width="70px">' . $product['image'] . '</td>';
$table .= '<td>' . $product['detail'] . '</td>';
$table .= '</tr>';
}
$table .= '</table>';
return $table; //返回拼装好的 html代码
}
}路由分拆实例
分析地址: http://app.io/PHPtask/1011/mvc/route.php?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=switch%20php&oq=switch&rsv_pq=dc01453400008c1e&rsv_t=625cSJbf52nykC8m%2F%2FLMaVmC4d22vTDPptUQ6IuUq7OxWkBKBFAcEYRoH3E&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=4&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=1440&rsv_sug4=1441
$uri = $_SERVER['REQUEST_URI'];
echo $uri;
$req = explode('?', $uri); // 分拆? 后面的内容
$req = explode('&', $req[1]); // 分拆 & 符内容
//foreach 循环赋值 方法 分拆 = 内容
foreach ($req as $valus) {
$valus1 = explode('=', $valus);
$params[$valus1[0]] = $valus1[1];
}
echo '<pre>'. print_r($params, true);
//for 计数 循环赋值 方法 分拆 = 内容
for ($i=0; $i<count($req); $i+=1) {
$valus1= explode('=', $req[$i]);
$params[$valus1[0]] = $valus1[1];
}
echo '<pre>'. print_r($params, true);
$valus = array_slice($params, 5, 6); // 获取想要的内容
echo '<pre>'. print_r($valus, true);效果图如下 :

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号