php路由实现原理

阅读别人的代码除了硬读, 更好的方式是开调试器(如xdebug)走单步调试, 一方面你有来自于调试器的信息, 另一方面有你自己的实际的可以跑起来的用例(你写的测试用的代码), 能够更加方便你理解

回到路由这个话题, 说到底你其实只要想明白怎么拆分解析pathinfo就可以了, 直接根据pathinfo映射到namespace还是通过正则表达式映射到某个controller都只是其中的一个解析方式罢了

如果如果要试着造轮子的话, 你可以试着实现一个最简单的直接映射到namespace下面的class的方法的

hello/world -> HelloController->world()

test/hello/world -> test\HelloController->world()

路由解析出来之后是分发, 这块可以去了解反射, Closure等等相关的知识

最后, github上有很多只实现router的组件可以找到, 比起整体框架, 你也可以选择只读那些组件的代码 (实际使用可以通过composer引入你的项目)

例如:

1

给你推荐一个路由实现

https://github.com/bephp/router

  1. 代码很短,100行左右

  2. 支持get,post等方式定义路由,只要是callable的都能行。

  3. 除了匹配pathinfo里面的参数意以外,还会通过反射自动获取参数.(这个特性比较有用)

  4. 使用树形结构存储路由映射表,比常用的几个路由性能要好(有beachmark)

  5. 支持“编译”,相当于缓存路由表,获取更快性能

  6. 可以使用composer安装,零依赖

当然,还有更简单直接的

class R{function($r,$c){$this->r[$r]=$c;} function($r){$this->r[$r]();}}
$r=new R;
$r->a('/', function(){echo 'hello world';});
$r->e('/');

1

MVC的核心思想是分离界面和逻辑,个人认为跟前端路由没什么关系,前端路由只不过是为了统一入口.

不要把问题想得太复杂,其实就是提取出字符串,然后套数组,其实就是一行代码的事.

<?php
$_SERVER['REQUEST_URI'] = '/post/edit/1024?foo=bar';
$uri = explode('/', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
var_export($uri);
//输出
array (
  0 => '',
  1 => 'post', //控制器(控制器存在就require)
  2 => 'edit', //方法
  3 => '1024', //参数(获取参数foo就用传统的$_GET['foo'])
)

$class = $uri[1];
require 'controller/'.$class.'.php'; // controller/post.php
$object = new $class();
$action = $uri[2];
$parameter = $uri[3];
echo call_user_func_array(array($object, $action), array($parameter)); //调用对象里的方法并传参

controller/post.php:
class post {
    public function edit($id) {
        return '$'.__CLASS__.'->'.__FUNCTION__.'('.$id.')'; //输出 $post->edit(1024)
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值