搜索
博主信息
博文 34
粉丝 1
评论 1
访问量 47635
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
写一个简单的路由,将URL地址直接路由一个函数——2019年8月7日22时01分
嘿哈的博客
原创
1210人浏览过

路由的原理与实现

1.从pathinfo分割出独立单元保存为数组;

2.从pathinfo解析出模块/控制器/操作;

3.从pathinfo解析出变量键值对;


实例

<?php

//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 '<pre>'.print_r($request,true);

//将键名action绑定变量方法名
$pathinfo['action'] = $request['4'];

//echo '<pre>'.print_r($pathinfo,true);

//offset偏移量,将偏移量之后的键值对另存为一个数组
$values = array_slice($request,5);

//echo '<pre>'.print_r($values,true);

//路由一个函数,闭包函数,use() 连接闭包和外界变量。
$pathinfo['action'] = function (...$values) use ($pathinfo)
{
//    echo '<pre>'.print_r($values,true);
    for ($i=0;$i<count($values);$i=$i+2)
    {
        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.创建控制器,实例化并打印出来;



实例

<?php

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.创建商品继承门面进行实例化


实例

<?php

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

运行实例 »

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

批改状态:合格

老师批语:代码出来了, 关键是要理解并记住
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学