许多PHP框架能实现把URL中的数据,按照键值对动态解析传入方法的参数中。
例如:
//访问链接:“....../prints/a/123/b/456/”
/*对应function*/
function prints($a,$b)
{
echo $a . $b;;
}
//最后输出'123456'
我刚开始想到的是利用可变参数,把URL数据解析成数组,作为可变参数传进去
//解析URL,过程省略
$func_name = ******;//方法名
$par_arr = [******];//将参数解析为关联数组
if (function_exists($func_name)) {
$func_name(...$par_arr);
}
最后运行却得到报错,大致意思是不支持传入关联数组。也就是说,用可变参数的方法能实现参数按顺序传入,但不能按键值对传入。
然后我去翻了翻ThinkPHP,看了好久也没看出什么名堂。有没有哪位高手知道如何实现按照键值对动态传入参数,希望能给个Demo或者思路,非常感谢!
首先需要说明的是,URL写作
/index.php/xx/b/c
可以直接被index.php
文件接受,而不用做任何额外的操作但是如果需要在URL中隐藏
index.php
的话,才需要伪静态重写规则,将^(.*)$
重写到/index.php/$1
首先,需要从URI拆分键值对(此处省略)
下面的思路是(依次):
获取到要调用函数的参数名
按照参数名称排序URI拆分出的键值对
使用
call_user_func_array()
方法,动态调用函数由于键值对经过了按照参数名顺序排序,所以新的URI键值对中,值的顺序恰好是和需要调用函数的顺序对应的,所以可以直接用
call_user_func_array()
调用下面,介绍一下其中需要用到的知识:
call_user_func_array
array_fill_keys
ReflectionFunction或者ReflectionMethod
由于Reflection部分缺少官方文档,贴出Overflow的回答作为示例:https://stackoverflow.com/que...
下面上代码: