Blogger Information
Blog 35
fans 3
comment 0
visits 25090
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
12月4日作业 php mvc 容器 门面类
随风
Original
761 people have browsed it

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文件中,如何调用 如何回传参数 。 请老师指点一下。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:闭包也是一种数据类型, 它的值是一个函数.... call_user_func_array(), 由系统来代理用户调用一个函数/方法, 而不需要用户主动调用
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post