容器注入: // 容器,和 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);
效果图如下 :