路由的原理与实现
1.从pathinfo分割出独立单元保存为数组;
2.从pathinfo解析出模块/控制器/操作;
3.从pathinfo解析出变量键值对;
实例
//print_r($_SERVER['REQUEST_URI']);
//演示地址:http://php.io/%E4%BD%9C%E4%B8%9A/0807/index.php/hello/id/1/name/hjc
//获取URL地址
$url = $_SERVER['REQUEST_URI'];
//分割成独立单元保存为数组
$request = explode('/',$url);
//echo '
'.print_r($request,true);
//将键名action绑定变量方法名
$pathinfo['action'] = $request['4'];
//echo '
'.print_r($pathinfo,true);
//offset偏移量,将偏移量之后的键值对另存为一个数组
$values = array_slice($request,5);
//echo '
'.print_r($values,true);
//路由一个函数,闭包函数,use() 连接闭包和外界变量。
$pathinfo['action'] = function (...$values) use ($pathinfo)
{
// echo '
'.print_r($values,true);
for ($i=0;$i
{
if (isset($values[$i+1]))
{
$params[$values[$i]] = $values[$i+1];
}
}
$res = '';
foreach ($params as $key => $value)
{
$res .= $key . '='.$value.',';
}
return '方法名:'.$pathinfo['action'].'键值对:'.$res;
};
echo call_user_func_array($pathinfo['action'],$values);
运行实例 »
点击 "运行实例" 按钮查看在线实例
关于本节课其他笔记:
容器的原理:
是一个类,需至少提供2个功能,一个创建类实例,一个取出类实例;
步骤:
1.初始化一个空数组 protected $instance = [];
2.将某个类实例绑定在容器中 $this->instance[$alias]=$process
3.从容器中取出对象 return call_user_func_array($this->instance[$alias],$params);
4.将模型与视图的实例绑定到容器
5.创建控制器,实例化并打印出来;
实例
namespace demo1;
require 'Model1.php';
require 'View1.php';
class Container
{
// 类实力数组,对象池
protected $instance = [];
// 将某个类绑定到容器中
public function bind($alias, $process)
{
$this->instance[$alias] = $process;
}
// 从容器中取出对象
public function make($alias,$params = [])
{
return call_user_func_array($this->instance[$alias],$params);
}
}
$container = new Container();
$container->bind('Model1',function (){return new \Model1();});
$container->bind('View1',function (){return new \View1();});
//控制器
class Controller
{
public function index(Container $container)
{
$data = $container->make('Model1')->getData();
return $container->make('View1')->fetch($data);
}
}
$controller = new Controller();
echo $controller->index($container);
运行实例 »
点击 "运行实例" 按钮查看在线实例
门面原理:
1.创建容器类实例和模型数据
2.初始化方法对$container进行后期静态绑定
3.创建获取数据静态接口和渲染模板的静态接口
4.创建商品继承门面进行实例化
实例
require 'Model1.php';
require 'View1.php';
class Container
{
//对象池
protected $instance = [];
//实例绑定到容器中
public function bind ($alias , Closure $process)
{
//类实力保存到容器中
$this->instance[$alias] = $process;
}
public function make($alias,$params=[])
{
return call_user_func_array($this->instance[$alias],$params);
}
}
//将模型与视图的实例绑定到容器中
$container = new Container();
$container->bind('Model1',function (){return new Model1();});
$container->bind('View1',function (){return new View1();});
//门面
class Facade
{
//容器类的实例
protected static $container = null;
//模型数据
protected static $data = [];
//初始化方法
public static function initialize(Container $container)
{
static::$container = $container; //后期静态绑定
}
//获取模型数据静态接口
public static function getData()
{
static::$data = static::$container->make('Model1')->getData();
}
//渲染模板的静态接口
public static function fetch()
{
return static::$container->make('View1')->fetch(static::$data);
}
}
//商品类
class Product extends Facade
{
}
//客户端控制器
class Controller
{
public function __construct(Container $container)
{
Product::initialize($container);
}
public function index()
{
Product::getData();
return Product::fetch();
}
}
$controller = new Controller($container);
echo $controller->index();
运行实例 »
点击 "运行实例" 按钮查看在线实例