博客列表 >12月4日作业 php mvc 容器 门面类

12月4日作业 php mvc 容器 门面类

随风
随风原创
2019年12月05日 17:16:08763浏览

php mvc 容器 门面类

课堂源码

model

`<?php

namespace gzg;
// require DIR . ‘/pdo.php’;
class Model
{
public function getDate()
{
return [
[‘id’=>1, ‘name’=>’苹果电脑’, ‘model’=>’MacBook Pro’, ‘price’=>25800],
[‘id’=>2, ‘name’=>’华为手机’,’model’=>’P30 Pro’,’price’=>4988],
[‘id’=>3, ‘name’=>’小爱同学’,’model’=>’AI音箱’,’price’=>299],
];
}
}

// $obj = new Model();
//print_r( $obj->getDate());
`

view

`<?php

namespace gzg;
// 视图类:渲染数据
class View
{
public function fetch($data)
{
$table = ‘<table>‘;
$table .= ‘<caption>商品信息表</caption>‘;
$table .= ‘<tr><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>‘;

  1. foreach ($data as $product) {
  2. $table .= '<tr>';
  3. $table .= '<td>' . $product['id'] . '</td>';
  4. $table .= '<td>' . $product['name'] . '</td>';
  5. $table .= '<td>' . $product['model'] . '</td>';
  6. $table .= '<td>' . $product['price'] . '</td>';
  7. $table .= '</tr>';
  8. }
  9. $table .= '</table>';
  10. return $table;
  11. }

}

echo ‘<style>
table {border-collapse: collapse; border: 1px solid; width: 500px;height: 150px}
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:lightblue;}
td,th {border: 1px solid}
td:first-of-type {text-align: center}
</style>‘;`

cont

`<?php

// 控制器: 将商品信息表展示出来
namespace gzg;

// 1. 加载模型
require ‘Model.php’;

// 2. 加载视图
require ‘View.php’;

// 3. 创建控制器
class Controller1
{
public function index()
{
// 3.1 获取数据
$model = new Model();
$data = $model->getDate();

  1. // 3.2 渲染模板
  2. $view = new View();
  3. return $view->fetch($data);
  4. }

}
// 4. 客户端调用/访问类成员
$cont = new Controller1();
echo $cont->index();
`

cont1

`<?php

// 控制器: 将商品信息表展示出来
// 将类中对其它类的实例化, 模型/视图分离出来, 降低耦合度

// 依赖注入 传参
namespace gzg;

// 1. 加载模型
require ‘Model.php’;

// 2. 加载视图
require ‘View.php’;

// 3. 创建控制器
class Controller2
{
// public function index( $model,$view)
// Model类的$model参数 ,View 类的$view参数
// 依赖注入 接收参数
public function index(Model $model,View $view)
{
// 3.1 获取数据

  1. $data = $model->getDate();
  2. // 3.2 渲染模板
  3. return $view->fetch($data);
  4. }

}
// 4. 客户端调用/访问类成员
// 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
$model = new Model();
$view = new View();
// 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
$cont = new Controller2();
//注入参数
// 依赖注入 传参
echo $cont->index($model,$view);
`

cont2

`<?php

// 控制器: 将商品信息表展示出来
// 依赖注入: 将注入点改到了控制器的构造方法中
namespace gzg;

// 1. 加载模型
//use BaconQrCode\Common\Mode;
require ‘Model.php’;

// 2. 加载视图
require ‘View.php’;

// 3. 创建控制器
class Controller3
{
protected $model;
protected $view;
// 依赖注入: 将注入点改到了控制器的构造方法中
public function __construct(Model $model,View $view)
{
$this->model =$model;
$this->view =$view;

  1. }

// public function index( $model,$view)
// Model类的$model参数 ,View 类的$view参数
// public function index(Model $model,View $view)
// 使用构造函数中的参数
public function index()
{
// 3.1 获取数据

// $data = $model->getDate();
// 3.1 获取数据
$data = $this->model->getDate();

  1. // 3.2 渲染模板
  2. return $this->view->fetch($data);
  3. }

// return $view->fetch($data);

}
// 4. 客户端调用/访问类成员
// 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
$model = new Model();
$view = new View();
// 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
// 传给构造器
$cont = new Controller3($model,$view);
//注入参数
echo $cont->index();

`

cont3

`<?php

// 控制器: 将商品信息表展示出来
// 依赖注入: 将注入点改到了控制器的构造方法中
namespace gzg;

// 1. 加载模型
//use BaconQrCode\Common\Mode;
require ‘Model.php’;

// 2. 加载视图
require ‘View.php’;
//3、 加载 容器
//require ‘Container.php’;

class Container
{
// 容器属性, 就是一个数组,里面全是创建对象的方法
protected $intstance = [];

  1. // 1. 放进去: 将类的实例化过程绑定到容器中
  2. // $alias: 类实例的别名,
  3. public function bind($alias , \closure $process)
  4. {
  5. // 将类实例化的方法绑定/ 存储到服务容器中
  6. $this->intstance[$alias] = $process;

// 例如 Model View
// $this -> intstance [‘model’] =new \gzg\Model(x,y);
// $this -> intstance [‘view’] =new \gzg\View(x,y );
}
// 2. 取出来: 执行容器中的实例方法
public function make ($alias ,$params=[])
{
// call_user_func_array() 全局函数的回调
return call_user_func_array($this->intstance[$alias],[]);
}

}

$container = new Container();
// 用到模型对象, 视图对象,将它们绑定到容器中
$container-> bind(‘model’,function () {return new \gzg\Model();});
$container->bind(‘view’,function (){return new View();});

// 3. 创建控制器
class Controller4
{
// protected $model;
// protected $view;
// 依赖注入: 将注入点改到了控制器的构造方法中
// public function __construct(Model $model,View $view)
// {
// $this->model =$model;
// $this->view =$view;
//
// }

// public function index( $model,$view)
// Model类的$model参数 ,View 类的$view参数
// public function index(Model $model,View $view)
// 使用构造函数中的参数
public function index(Container $container)
{
// 3.1 获取数据

// $data = $model->getDate();
// 3.1 获取数据
$data = $container->make(‘model’)->getDate();

  1. // 3.2 渲染模板
  2. return $container->make('view')->fetch($data);
  3. }

// return $view->fetch($data);

}
// 4. 客户端调用/访问类成员
// 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
//$model = new Model();
//$view = new View();
// 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
// 传给构造器
$cont = new Controller4();
//注入参数
echo $cont->index($container);

`

cont4

`<?php

// 控制器: 将商品信息表展示出来
// 依赖注入: 将注入点改到了控制器的构造方法中
namespace gzg;

// 1. 加载模型
//use BaconQrCode\Common\Mode;
require ‘Model.php’;

// 2. 加载视图
require ‘View.php’;
//3、 加载 容器
//require ‘Container.php’;

class Container1
{
// 容器属性, 就是一个数组,里面全是创建对象的方法
protected $intstance = [];

  1. // 1. 放进去: 将类的实例化过程绑定到容器中
  2. // $alias: 类实例的别名,
  3. public function bind($alias , \closure $process)
  4. {
  5. // 将类实例化的方法绑定/ 存储到服务容器中
  6. $this->intstance[$alias] = $process;

// 例如 Model View
// $this -> intstance [‘model’] =new \gzg\Model(x,y);
// $this -> intstance [‘view’] =new \gzg\View(x,y );
}
// 2. 取出来: 执行容器中的实例方法
public function make ($alias ,$params=[])
{
// call_user_func_array() 全局函数的回调
return call_user_func_array($this->intstance[$alias],[]);
}

}

$container = new Container1();
// 用到模型对象, 视图对象,将它们绑定到容器中
$container-> bind(‘model’,function () {return new \gzg\Model();});
$container->bind(‘view’,function (){return new View();});

/**/
// 添加Facade门面类
class Facade
{
protected static $container = null;
protected static $data = [];

  1. // 用服务容器给它初始化
  2. public static function initialize(Container1 $container)
  3. {
  4. static::$container =$container;
  5. }
  6. // 用静态代理方式将模型中的getData()静态化
  7. public static function getDate()
  8. {
  9. static::$data = static::$container->make('model')->getDate();
  10. }
  11. // 用静态代理方式将视图中的fetch()静态化
  12. public static function fetch()
  13. {
  14. return static::$container->make('view')->fetch(static::$data);
  15. }

}

// 3. 创建控制器
class Controller5
{
// protected $model;
// protected $view;
// 依赖注入: 将注入点改到了控制器的构造方法中
public function __construct(Container1 $container)
{
// $this->model =$model;
// $this->view =$view;
Facade::initialize($container);

  1. }

// public function index( $model,$view)
// Model类的$model参数 ,View 类的$view参数
// public function index(Model $model,View $view)
// 使用构造函数中的参数
public function index()
{
Facade::getDate();
return Facade::fetch();
// 3.1 获取数据

// $data = $model->getDate();
// 3.1 获取数据
// $data = $container->make(‘model’)->getDate();

  1. // 3.2 渲染模板

// return $container->make(‘view’)->fetch($data);
}
// return $view->fetch($data);

}
// 4. 客户端调用/访问类成员
// 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
//$model = new Model();
//$view = new View();
// 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
// 传给构造器
$cont = new Controller5($container);
//注入参数
echo $cont->index();

`

手抄


总结

学习了mvc 容器 门面类 ,MVC 没有多大问题,门面类 就把类静态化 。关键是容器感觉似懂非懂,请老师重点讲一下

容器 \closure $process 代表的意思还是不懂,这是自己定义的吗?

call_user_func_array 函数是回调,我在网上查了半天请老师在点一下。

另外 容器和门面类 如何放到新建 php文件中,如何调用 如何回传参数 。 请老师指点一下。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议