MVC
- M :MODEL ,模型,数据库操作
- V :VIEW 视图,页面,html
C :Controller,控制器
MVC运行流程
View->Controller->Model 前端视图->处理操作->后端操作
- Model->Controller->View 后端操作->处理操作->前段视图
示例:
- Model.php 后端操作
<?php
namespace MVC_test;
use PDO;
class Model
{
public function myDate()
{
return ($pdo = new PDO('mysql:host=localhost;dbname=mysqli','root','142536'))
->query('select * from user limit 10')->fetchAll(PDO::FETCH_ASSOC);
}
}
示例图:
Model.php 功能主要是一个连接数据库类
View.php 前端视图
<?php
namespace MVC_test;
class View
{
public function mysHow($data)
{
$table = '<table>';
$table.='<tr></tr>';
$table .= '<caption>用户信息表</caption>';
$table .= '<tr><th>用户名</th><th>性别</th><th>年龄</th><th>邮箱</th><th>手机</th></tr>';
foreach($data as $user)
{
$table .= '<tr>';
$table .= '<td>'.$user['username'].'</td>';
$table .= '<td>'.$user['sex'].'</td>';
$table .= '<td>'.$user['age'].'</td>';
$table .= '<td>'.$user['email'].'</td>';
$table .= '<td>'.$user['mobile'].'</td>';
}
$table.='<tr></table>';
return $table;
}
}
echo '<style>
table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:yellow;}
td,th {border: 1px solid; padding:5px}
</style>';
示例图:
- View.php 在前端展示的类
- Controller.php 操作控制器
示例:
<?php
namespace MVC_test;
require 'Model.php';
require 'View.php';
class Controller
{
public function Index()
{
$data = (new Model)->myDate();
//引入Model.php的myDate方法(链接数据库)
return (new View)->mysHow($data);
//返回引入View.php的mysHow方法(展示html)
}
}
- Controller.php 引入Model.php和View.php 写入Index()方法。
- 此方法适用于简单的少量类调用。
- Controller_1.php 操作控制器
示例
<?php
namespace MVC_test;
require 'Model.php';
require 'View.php';
class Controller_1
{
private $data = NULL;
private $show = NULL;
public function __construct($data,$show)
{
$this->data = $data;
$this->show = $show;
}
public function Index()
{
$this->data = (new Model)->myDate();
return $this->show = (new View)->mysHow($this->data);
}
}
- Controller_1.php 引入Model.php和View.php 写入Index()方法。
- 使用构造函数,将引用的类加载,此方法适用于简单的少量类调用,相对第一张增加了技术含量。
- Controller_2.php 操作控制器
示例:
<?php
namespace MVC_test;
use Closure;
//加载模型类
require 'Model.php';
//加载视图类
require 'View.php';
//服务容器
class Container
{
// 1. 服务容器
protected $instances = [];
//定义一个空数组来存储对象
public function bInd($alias, Closure $process)
// 2. 向对象容器中添加对象
// 参数1: 是外部对象在当前对象容器数组中的键名/别名
// 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)
{
$this->instances[$alias] = $process;
//将实例化过程写入服务容器
}
public function make($alias,$params=[])
// 3. 从对象容器中取出对象, 调用它
// 参数1:传入服务容器中的别名
// 参数2:一个空的数组
{
return call_user_func_array($this->instances[$alias], []);
// 从instances中取出对象名
// call_user_func_array :调用回调函数,并把一个数组参数作为回调函数的参数。
}
}
// 将外部对象: Model, View的实例绑定到服务容器中
$container = new Container;
// 绑定模型类实例绑定到服务容器中
$container->bInd('model', function(){
return new Model();
});
$container->bInd('view',function(){
return new View();
});
class Controller_2
{
public function Index(Container $container)
{
$data = $container->make('model')-> myDate();
return $container->make('view')->mysHow($data);
}
}
- Controller_2.php 引入Model.php和View.php 写入Index()方法。
- 使用服务容器,将Model()和View.php,写入数组中,然后在调用。
- 服务容器:定义一个空数组来存储对象,使用bind方法将实例化的类存储到数组中bind需要两个参数,1.数组存储的位置。2.闭包实例化过程存储到数组。
需要用到 call_user_func_array :调用回调函数,并把一个数组参数作为回调函数的参数。重点:将没收示例绑定到服务容器中。bind(‘实例名’,function(){ return new Model())})函数返回Model.php的实例化对象。
此种写法可以在更多的类实例化调用中更加的快捷方便,只需在bind绑定中添加需要实例化的类,在进行调用。
- Controller_3.php 操作控制器
示例:
<?php
namespace MVC_test;
use Closure;
//加载模型类
require 'Model.php';
//加载视图类
require 'View.php';
//服务容器
class Container_1
{
// 1. 服务容器
protected $instances = [];
//定义一个空数组来存储对象
public function bInd($alias, Closure $process)
// 2. 向对象容器中添加对象
// 参数1: 是外部对象在当前对象容器数组中的键名/别名
// 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)
{
$this->instances[$alias] = $process;
//将实例化过程写入服务容器
}
public function make($alias,$params=[])
// 3. 从对象容器中取出对象, 调用它
// 参数1:传入服务容器中的别名
// 参数2:一个空的数组
{
return call_user_func_array($this->instances[$alias], []);
// 从instances中取出对象名
// call_user_func_array :调用回调函数,并把一个数组参数作为回调函数的参数。
}
}
// 将外部对象: Model, View的实例绑定到服务容器中
$container = new Container_1;
// 绑定模型类实例绑定到服务容器中
$container->bInd('model', function(){
return new Model();
});
$container->bInd('view',function(){
return new View();
});
// --------------------------------------------------------
class Facade
{
//服务容器
protected static $container =NULL;
// 初始化方法:就是给当前的Facade类扣$container属性赋值
//整理为Facade的构造方法
//将外部的服务容器注入到当前的facade中
public static function initialize(Container_1 $container)
{
static::$container = $container;
}
}
class UserModel extends Facade
{
public static function myDate()
{
return static::$container->make('model')->myDate();
}
}
class UserView extends Facade
{
public static function mysHow($data)
{
return static::$container->make('view')->mysHow($data);
}
}
// --------------------------------------------------------
class Controller_3
{
//构造方法,初始化facade
public function __construct(Container_1 $container)
{
Facade::initialize($container);
}
public function Index()
{
//1.获取数据
$data =UserModel::myDate();
//2.渲染模板
return UserView::mysHow($data);
}
}
- Controller_3.php 引入Model.php和View.php 写入Index()方法。
- 继承Controller_2中添加类Facade,通过子类及方法将类的实例化通过静态方法调用。
- Index.php 前段调用显示
示例:
<?php
namespace MVC_test;
// --------------------------
// require 'Controller.php';
// $index = new Controller;
// echo $index->Index();
// ------------>Controller控制器的引用
// require 'Controller_1.php';
// $index = new Controller_1($data,$show);
// echo $index->Index();
// ------------>Controller_1控制器的引用
// --------服务容器----------
// require 'Controller_2.php';
// $index = new Controller_2();
// echo $index->Index($container);
// ------------>Controller_2控制器的引用
//-----------Facade-----------
require 'Controller_3.php';
$index = new Controller_3($container);
echo $index->Index();
- Index.php 用户访问显示。调用了控制器方法。实现了MVC的业务逻辑。
总结:在对MVC的学习中,掌握了服务容器及facade对类实例化对象的使用。不需要再对每个类实例化繁琐调用。也大体的掌握了面对对象编程的业务逻辑。