直接写路由php,写一个简单的路由,将URL地址直接路由一个函数——2019年8月7日22时01分...

路由的原理与实现

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();

运行实例 »

点击 "运行实例" 按钮查看在线实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值