Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:原理明白, 能写点东西了
<?php
// 类1
class Model1
{
public function model()
{
return __FILE__;
}
}
// 类2
class View1
{
public function view()
{
return __CLASS__;
}
}
// 服务容器
class Controller
{
// 装对象的容器
protected $instances = [];
// 绑定对象的方法:向对象容器中添加一个类实例
// $alias:要添加的对象
// \Closure:类型约束,闭包
// $process:实列化的过程
public function bank($alias, \Closure $process)
{
// 实列化对象
$this->instances[$alias] = $process;
}
// 取出对象的方法
// $alias:要取出的对象
// $params = []:构造函数所使用的参数,以数组的形式传递
public function make($alias,$params = [])
{
return call_user_func_array($this->instances[$alias],[]);
}
// 销毁对象的方法
// $alias:要销毁对象
public function unset($alias)
{
unset($this->instances[$alias]);
}
}
$facade = new Controller;
// 绑定方法
$facade->bank('model',function(){return new Model1;});
$facade->bank('view',function(){return new view1;});
// 控制器
class Controller1
{
// 把服务容器的实列化当成参数传递给控制器中方法
// facade:类型限定
// $facade:服务容器的实列化
public function index(controller $facade)
{
return $facade->make('model')->model();
}
}
// 客户端
$controllers = new Controller1;
echo $controllers->index($facade);
<?php
// 类1
class Model1
{
public function model()
{
return __FILE__;
}
}
// 类2
class View1
{
public function view()
{
return __CLASS__;
}
}
// 服务容器
class Controller
{
// 装对象的容器
protected $instances = [];
// 绑定对象的方法:向对象容器中添加一个类实例
// $alias:要添加的对象
// \Closure:类型约束,闭包
// $process:实列化的过程
public function bank($alias, \Closure $process)
{
// 实列化对象
$this->instances[$alias] = $process;
}
// 取出对象的方法
// $alias:要取出的对象
// $params = []:构造函数所使用的参数,以数组的形式传递
public function make($alias,$params = [])
{
return call_user_func_array($this->instances[$alias],[]);
}
// 销毁对象的方法
// $alias:要销毁对象
public function unset($alias)
{
unset($this->instances[$alias]);
}
}
$controller = new Controller;
// 绑定方法
$controller->bank('model',function(){return new Model1;});
$controller->bank('view',function(){return new view1;});
// 4. Facade门面技术: 可以接管对容器中的对象的访问
class Facade
{
// 服务容器实例属性
protected static $containers = null;
// 数据
protected static $data = [];
// 初始化方法
// 初始化方法: 从外部接收一个依赖对象: 服务容器的实例
// $container:服务容器的实例
public static function initialize(controller $controller)
{
static::$containers = $controller;
}
public static function make()
{
static::$data = static::$containers->make('model')->model();
}
public static function view()
{
return static::$data = static::$containers->make('view')->view(static::$data);
}
}
// 控制器
class Controller1
{
// 构造方法: 调用门面的初始化方法
public function __construct(controller $controller)
{
Facade::initialize($controller);
}
public function index()
{
return facade::view();
}
}
// 客户端
$controllers = new Controller1($controller);
echo $controllers->index();
<?php
// $_SERVER['QUERY_STRING']:查询字符串/URL/查询变量/GET变量
// ?action=edit&id=19&name=admin
// $_SERVER['PATH_INFO']:路径变量
// /user/getuser/id/200/name/admin
// 通过PATHINFO,解析url中控制器和方法
http://php.cn/php/0514/routs.php/user/getuser?id=200&name=adname
class user
{
public function getUser($id, $name)
{
return "id ==> $id, name ==> $name";
}
}
// 1. 解析出PATHINFO
// explode():把字符串分解为数组
// array_filter():过滤数组的空元素
// array_values():将数组中只从新排列
$pathinfo = array_values(array_filter( explode('/' , $_SERVER['PATH_INFO'])));
// print_r($pathinfo) ;
// 2. 解析控制器
// ucfirst():首字母转为大写
$controller = ucfirst($pathinfo[0]);
// echo $controller;
// 3. 解析控制器中的方法
$action = $pathinfo[1];
// echo $action;
// 4. 解析参数:返回值是数组
// $_SERVER['QUERY_STRING']:获取url后面的参数以及值的
// parse_str():把查询字符串解析到变量中:参数1:查询字符串,参数2:变量
parse_str($_SERVER['QUERY_STRING'],$params);
// print_r($params);
// 5. 调用控制器方法
$user = new $controller();
// 解构变量
echo $user->$action(...array_values($params));