## 一.用mvc演示几种设计模式,实现一个简单查询展示数据
文档说明
序号 | 文件 | 注释 |
---|---|---|
1 | Connect.php |
数据库链接 |
2 | Model.php |
模型类 |
3 | View.php |
视图类 |
4 | Controller.php |
依赖注入之方法参数形式注入 |
5 | Controller2.php |
依赖注入之实列化参数形式注入 |
6 | Controller3.php |
服务容器 |
7 | Controller4.php |
Facade门面技术 |
1.Connect.php
:数据库链接
<?php
namespace demo_MVC;
//数据库参数
class Connect{
private $param =[
'DB_HOST'=>'localhost',
'DB_TYPE'=>'mysql',
'DB_NAME'=>'my_user',
'DB_PASSWORD'=>'root123',
'DB_USER'=>'root',
'DB_CHARSET'=>'utf8',
'DB_PORT'=>'3306'
];
//连接数据
public function link(){
try{
//连接数据款
return $pdo = new \PDO("mysql:host=localhost;dbname=my_user;charset=utf8",$this->param['DB_USER'],$this->param['DB_PASSWORD']);
} catch(\PDOException $e){
//捕捉特定于数据库信息的PDOEXCEPTION 异常
echo $e->getMessage();
} catch(\Throwable $e){
//捕捉拥有Throwable接口的错误或者其他异常
echo $e->getMessage();
}
}
}
Model.php
:模型类<?php
namespace demo_MVC;
//加载数据库连接
require "./connect.php";
class Model extends Connect
{
//查询数据
public function getInfo(){
$pdo = parent::link();
$sql = "SELECT * FROM `mu_user` LIMIT ?";
$limit =6;
$stm = $pdo ->prepare($sql);
$stm ->bindParam(1,$limit,\PDO::PARAM_INT);
$stm ->execute();
$result = $stm ->fetchAll();
return $result;
}
}
3.
View.php
:视图类<?php
namespace demo_MVC;
class View
{
public function rendering($result){
$table ="<table>
<caption>用户列表</caption>
<tr>
<td>ID</td>
<td>名称</td>
<td>电话</td>
<td>操作</td>
</tr>";
foreach( $result as $list){
$table .="<tr>
<td>".$list['id']."</td>
<td>".$list['username']."</td>
<td>".$list['phone']."</td>
<td>
<button onclick='location.href='control.php?act=edit&id=".$list['id']."' >编辑</button>
<button onclick='del(".$list['id'].")'>删除</button>
</td>
</tr>";
}
$table .="</table>";
$rend =$table."<style>
table{
text-align: center;
border:2px solid #222;
border-collapse: collapse;
margin: 0 auto;
}
tr:first-of-type{
background-color:thistle;
}
td{
padding: 10px;
border:1px solid #000;
}
p{
text-align: center;
}
a{
text-align: center;
border:1px solid #000;
text-decoration: none;
padding: 5px 10px;
margin: 10px 2px;
border-radius: 10%;
}
p>span{
font-size: 1.5rem;
margin: auto;
padding: 10px;
}
.cla{
background-color: lightskyblue;
color: lightgoldenrodyellow;
border: 1px solid lightskyblue;
}
</style>";
return $rend;
}
}
4.Controller.php
:依赖注入之方法参数形式注入;
作用:解决代码‘代码耦合度’问题
<?php
namespace demo_MVC;
// 加载模型类
require "Model.php";
// 加载视图类
require "View.php";
//依赖注入之以控制器方法的参数形式注入
class Controller
{
//展示数据
public function list($model,$view){
$result = $model ->getInfo();
return $view->rendering($result);
}
}
//实列模型类
$model = new Model();
//实列视图类
$view = new View();
//客户端调用
echo (new Controller)->list($model,$view);
5.Controller2.php
:依赖注入之实列化参数形式注入
作用:解决代码‘代码耦合度’问题,且实现外部对象的复用
<?php
namespace demo_MVC;
require "Model.php";
require "View.php";
//依赖注入之以控实列化参数形式注入
class Controller2
{
private $model;
private $view;
// 通过构造方法将外部对象初始化,实现了外部对象在当前类的共享/复用
public function __construct($model,$view)
{
$this->model = $model;
$this->view = $view;
}
// 获取数据,并展示出来
public function list(){
$result = $this->model ->getInfo();
return $this->view->rendering($result);
}
}
//实列模型类
$model = new Model();
//实列视图类
$view = new View();
$Controller = new Controller2($model,$view);
echo $Controller->list();
6.Controller3.php
:服务容器
总结:将外部对象的依赖,使用服务容器进行了接管,使当前类对许多外部对象的依赖, 转为对一个服务容器的依赖
<?php
namespace demo_MVC;
use Closure;
require "Model.php";
require "View.php";
//服务容器
class contriner
{
// 1. 对象容器
protected $obj =[];
// 2. 向对象容器中添加对象
// 参数1: 是外部对象在当前对象容器数组中的键名/别名
// 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)
public function bind($alias, Closure $proess){
return $this->obj[$alias]= $proess;
}
//调用对象
public function make($alias,$param=[]){
//
return call_user_func_array($this->obj[$alias],$param);
}
}
//示例化容器
$contriner = new contriner();
//绑定模型类
$contriner->bind('model',function(){
return new Model();
});
//绑定视图类
$contriner->bind('view',function(){
return new View();
});
class Controller3
{
//把服务容器当作参数传入
public function list(contriner $contriner){
$result = $contriner->make('model') ->getInfo();
return $contriner->make('view')->rendering($result);
}
}
//客服端调用
$Controller = new Controller3();
echo $Controller->list($contriner);
7.Controller4.php
:Facade门面技术,静态接管服务容器中的成员的访问、
<?php
namespace demo_MVC;
use Closure;
require "Model.php";
require "View.php";
// 服务容器
class contriner1
{
// 1. 对象容器
protected $obj =[];
// 2. 向对象容器中添加对象
// 参数1: 是外部对象在当前对象容器数组中的键名/别名
// 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)
public function bind($alias, Closure $proess){
return $this->obj[$alias]= $proess;
}
//调用对象
public function make($alias,$param=[]){
return call_user_func_array($this->obj[$alias],$param);
}
}
//实例化服务容器
$contriner = new contriner1();
//绑定模型类
$contriner->bind('model',function(){
return new Model();
});
//绑定视图类
$contriner->bind('view',function(){
return new View();
});
//Facade门面技术, 静态接管服务容器中的成员的访问
class Facade
{
protected static $contriner = null;
// 初始化方法: 就是给当前的Facade类扣$container属性赋值
// 作用类似Facade的构造方法(但不是)
// 将外部的服务容器注入到当前的facade中
public static function initialize(contriner1 $contriner){
static::$contriner = $contriner;
}
}
//模型类成员访问静态化(给成员套一个静态访问的马甲)
class ListMomdel extends Facade
{
public static function getInfo()
{
return static::$contriner->make('model')->getInfo();
}
}
//视图类成员访问静态化(给成员套一个静态访问的马甲)
class ListView extends Facade
{
public static function rendering($result)
{
return static::$contriner->make('view')->rendering($result);
}
}
class Controller4
{
//初始化
public function __construct(contriner1 $contriner)
{
Facade::initialize($contriner);
}
public function list(){
$result = ListMomdel::getInfo();
return ListView::rendering($result);
}
}
// 客户端调用
$Controller = new Controller4($contriner);
echo $Controller->list();
二.总结
在类中经常实例化别的类,会造成代码耦合度过高;为解决这个问题,因而使用依赖注入;但如需要依赖注入外部对象很多,从而实例化很多外部对象,因此通过一个服务容器将外部对象统一示例化管理;而Facade门面技术进一步接管了对服务容器的访问,只需要对Facade进行调用访问