12月4日作业
1. 将课堂源代码, 全部写一遍, 在编辑器中写就可, 必须全部运行正确, 并加上自己理解的注释,不用手写
<?php
//控制器,将商品信息展示出来
namespace mvc;
//MVC基本套路
//1.加载模型 **M**
require 'Model.php';
//2.加载视图 **V**
require 'View.php';
//3.创建控制器**C**
class Controller1{
public function index(){
//3.1获取数据
$model=new Model();
$data=$model->getData();
//3.2渲染模板
$view=new View();
return $view->fetch($data);
}
}
//4.客户端调用/访问类成员
$controller = new Controller1();
echo $controller->index();
<?php
//控制器,将商品信息展示出来
//将类中对其他类的实例化,模型/视图分类出来,降低耦合度
//依赖注入
namespace mvc;
//MVC基本套路
//1.加载模型 **M**
require 'Model.php';
//2.加载视图 **V**
require 'View.php';
//3.创建控制器**C**
class Controller2{
public function index(Model $model,View $view){
//php现在已经支持类型定义了$model是Model 类的实例,$view是View类的对象,记着依赖注入的这种写法☆☆☆☆☆☆
//3.1获取数据
$data=$model->getData();
//3.2渲染模板
return $view->fetch($data);
}
}
//4.客户端调用/访问类成员
//将模型与视图的实例化代码从控制器分离出来,把实例化代码放到客户端
$model=new Model();
$view=new View();
//将模型对象与视图对象,以参数的方式再次注入放到控制器的方法
$controller = new Controller2();
echo $controller->index($model,$view);
<?php
//控制器,将商品信息展示出来
//将类中对其他类的实例化,模型/视图分类出来,降低耦合度
//依赖注入:将注入点该到控制器的构造方法中
namespace mvc;
//MVC基本套路
//1.加载模型 **M**
require 'Model.php';
//2.加载视图 **V**
require 'View.php';
//3.创建控制器**C**
class Controller3{
protected $model;
protected $view;
//构造方法,注入点改到了构造方法中,实现了模型与视图对象的共享
public function __construct(Model $model,View $view)
{
$this->model=$model;
$this->view=$view;
}
public function index(){
//php现在已经支持类型定义了$model是Model 类的实例,$view是View类的对象,记着依赖注入的这种写法☆☆☆☆☆☆
//3.1获取数据
$data=$this->model-> getData();
//3.2渲染模板
return $this->view->fetch($data);
}
}
//4.客户端调用/访问类成员
//将模型与视图的实例化代码从控制器分离出来,把实例化代码放到客户端
$model=new Model();
$view=new View();
//将模型对象与视图对象,以参数的方式再次注入放到控制器的方法
$controller = new Controller3($model,$view); //参数不再放在普通方法中而是构造方法中
echo $controller->index();
<?php
//控制器,将商品信息展示出来
//将类中对其他类的实例化,模型/视图分类出来,降低耦合度
//依赖注入:将注入点该到控制器的构造方法中
namespace mvc;
//MVC基本套路
//1.加载模型 **M**
require 'Model.php';
//2.加载视图 **V**
require 'View.php';
//添加一个服务容器层
class Container
{
//先创建个容器属性放对象,其实就是一个数组,里面全是创建对象的方法
protected $instance=[];
//1.放进去:将类的实例化过程绑定到容器中
//$alias:当前类实例的别名,会作为关联数组的键名
public function bind($alias,\Closure $process){
//将类实例化的方法绑定/存储到服务容器中
$this->instance[$alias]=$process;
}
//2.取出来:执行容器中的实例方法
public function make($alias,$params=[]){
return call_user_func_array($this->instance[$alias],[]);
}
}
//实例化容器
$container = new Container();
//用到模型对象 ,视图对象,将他们绑定到容器中。
$container->bind('model',function (){return new Model();});
$container->bind('view',function (){return new View();});
/***************************************************************/
//3.创建控制器**C**
class Controller4{
public function index(Container $container){
// 对象已经注入到容器里面了,这里只要注入容器就行
//php现在已经支持类型定义了$model是Model 类的实例,$view是View类的对象,记着依赖注入的这种写法☆☆☆☆☆☆
//3.1获取数据
$data=$container->make('model')-> getData();
//3.2渲染模板
return $container->make('view')->fetch($data);
}
}
//4.客户端调用/访问类成员
//将模型对象与视图对象,以参数的方式再次注入放到控制器的方法
$controller = new Controller4(); //参数不再放在普通方法中而是构造方法中
echo $controller->index( $container);
2. 将最后一个demo5.php中的代码, 手写提交
作业总结
一、MVC基本套路:
1.加载模型 M
2.加载视图 V
3.创建控制器C
3.1获取数据
3.2渲染模板
4.客户端调用/访问类成员
二、依赖注入
解耦,降低耦合度
避免在一个类中new 一个实例对象,尽可能用参数注入的方式
注入点就是把参数放到不同的方法中,就是参数列表,参数写哪个方法里,哪里就是注入点
class Controller2{
public function index(Model $model,View $view){
//php现在已经支持类型定义了$model是Model 类的实例,$view是View类的对象 记着依赖注入的这种写法☆☆☆☆☆☆
三、将普通方法注入改为构造注入
普通方法注入-》适用一次性的情况
构造方法注入-》多次、共享属性
四、容器:进一步共享
服务容器,统一管理,容器有两个基本功能:
0.先添加一个容器层,创建个容器属性放对象,其实就是一个数组,里面全是创建对象的方法 protected $instance=[];
1.放进来(绑定)将类的实例化过程绑定/存储到服务容器中
public function bind($alias,\Closure $process)
第二个参数是闭包类的代码,就是相当于new的过程
$this->instance[$alias]=$process;
$this->数组【键名(对象)】=值(闭包函数)
2.取出去 执行容器中的实例方法
```php
…
public function make($alias,$params=[]){
return call_user_func_array($this->instance[$alias],[]);
}
}
//实例化容器
$container = new Container();
//用到模型对象 ,视图对象,将他们绑定到容器中。
$container->bind(‘model’,function (){return new Model();});
$container->bind(‘view’,function (){return new View();});