MVC
- M:Model,模型,数据库操作
- V:View,视图,页面,html
- C:controller,控制器
模型类
<?php
// 模型类
namespace mvc_demo;
class Model
{
public function get()
{
return (new \PDO('mysql:host=localhost;dbname=user;charset=utf8', 'root', 'root'))
->query('select * from apple limit 10')->fetchAll(\PDO::FETCH_ASSOC);
}
}
视图类
<?php
// 视图类
namespace mvc_demo;
class view
{
public function fetch($date)
{
// 展示数据
$table = '<table>';
$table .= '<caption>用户信息表</caption>';
$table .= '<tr><th>ID</th><th>姓名</th><th>性别</th></tr>';
foreach ($date as $user) {
$table .= '<tr>';
$table .= '<td>' . $user['id'] . '</td>';
$table .= '<td>' . $user['username'] . '</td>';
$table .= '<td>' . $user['sex'] . '</td>';
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
}
echo '<style>
table{border-collapse:collapse;border:1px solid black;text-align:center;width:50%; margin:auto;}
caption{font-size:150%;margin-bottom:15px;}
th{background-color:wheat;}
td,th{border:1px solid black;}
</style>';
控制器1:实例化模型类和视图类在控制器中实现(造成代码耦合过高)
<?php
namespace mvc_demo;
require 'model.php';
require 'view.php';
class Cotroller1
{
public function index()
{
// 1.获取数据
$date = (new Model)->get();
// 2.渲染数据
return (new view)->fetch($date);
}
}
echo (new Cotroller1)->index();
控制器2:在控制器类外部实例化模型类和视图类,通过控制器方法参数调用(外部对象不能再控制器中复用)
<?php
namespace mvc_demo;
require 'model.php';
require 'view.php';
class Cotroller2
{
public function index($model, $view)
{
// 1.获取数据
$date = $model->get();
// 2.渲染数据
return $view->fetch($date);
}
}
$model = new Model;
$view = new view;
echo (new Cotroller2)->index($model, $view);
控制器3:通过控制器的构造器实例化(实现外部对象在控制器中复用)
<?php
namespace mvc_demo;
require 'model.php';
require 'view.php';
class Cotroller3
{
private $model;
private $view;
public function __construct($model, $view)
{
$this->model = $model;
$this->view = $view;
}
public function index()
{
// 1.获取数据
$date = $this->model->get();
// 2.渲染数据
return $this->view->fetch($date);
}
}
$model = new Model;
$view = new view;
echo (new Cotroller3($model, $view))->index();
服务容器:(把依赖的对象放进服务容器统一管理)
<?php
namespace mvc_demo;
require 'model.php';
require 'view.php';
// 服务容器
class Container1
{
// 1.对象容器
protected $instabces = [];
// 2.向对象容器添加对象
// 参数1:是外部对象的在对象容器中的键名/别名
// 参数2:添加外部对象的实例化过程
// closure:闭包(匿名函数)有命名空间存在所以要加上\
public function bind($alias, \Closure $process)
{
$this->instabces[$alias] = $process;
}
// 3.调用对象
public function make($alias, $params = [])
{
return call_user_func_array($this->instabces[$alias], $params);
}
}
// 将外部对象绑定到服务容器
$container = new Container1;
// 添加模型类
$container->bind('model', function () {
return new Model();
});
// 添加视图类
$container->bind('view', function () {
return new view();
});
// 控制器
class Cotroller3
{
public function index($container)
{
// 1.获取数据
$date = $container->make('model')->get();
// 2.渲染数据
return $container->make('view')->fetch($date);
}
}
echo (new Cotroller3)->index($container);
门面技术
<?php
namespace mvc_demo;
require 'model.php';
require 'view.php';
// 服务容器(将控制器依赖过多的外部对象转为依赖服务容器的依赖)
class Container1
{
// 1.对象容器
protected $instabces = [];
// 2.向对象容器添加对象
// 参数1:是外部对象的在对象容器中的键名/别名
// 参数2:添加外部对象的实例化过程
// closure:闭包(匿名函数)有命名空间存在所以要加上\
public function bind($alias, \Closure $process)
{
$this->instabces[$alias] = $process;
}
// 3.调用对象
public function make($alias, $params = [])
{
return call_user_func_array($this->instabces[$alias], $params);
}
}
// 将外部对象绑定到服务容器
$container = new Container1;
// 添加模型类
$container->bind('model', function () {
return new Model();
});
// 添加视图类
$container->bind('view', function () {
return new view();
});
// facade
class facade
{
protected static $container;
public static function initalize($container)
{
static::$container = $container;
}
}
// 模型类套一个静态马甲用于调用
class Userm extends facade
{
public static function get()
{
return static::$container->make('model')->get();
}
}
// 视图类套一个静态马甲用于调用
class Userv extends facade
{
public static function fetch($date)
{
return static::$container->make('view')->fetch($date);
}
}
// 控制器
class Cotroller3
{
// 构造方法生成服务容器
public function __construct($container)
{
facade::initalize($container);
}
public function index()
{
// 1.获取数据
$date = Userm::get();
// 2.渲染数据
return Userv::fetch($date);
}
}
echo (new Cotroller3($container))->index();
总结
1.对于设计模式有了一定的理解了
2.对于服务容器中调用对象的函数(call_user_func_array)没有理解好其应用