• 首先需要说明的是,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...

  • 下面上代码:

function test(....) {
} ... $funcRef = new ReflectionFunction('test');
# 或者$funcRef = new ReflectionMethod('class', 'test'); $paramNames = []; foreach($funcRef->getParameters() as $param) {
$paramNames[] = $param->name;
} $params = array_fill_keys($paramNames, NULL);
# 使用NULL为默认值,$paramNames为键名,填充一个参数键值对
# 如果参数对应项不传值,则那个值默认是NULL(暂不考虑有默认值的情况) # 假设从URI获取的键值对生成的数组为$URIParam
# 将$URIParam中的值填入上面生成的参数数组中
# 遍历$params在$URIParam中找的原因是,如果遍历$URIParam,对应的$params中的值都是NULL,无法通过值确定键名是否存在
# 而遍历$params的话,键名一定是参数列表中的,只需要看在$URIParams中是否存在即可
foreach($params as $paramName => $param) {
if(isset($URIParam[$paramName])) {
# 使用isset是为了避免直接判断而产生的等效假值问题
# 如果用if($URIParam[$paramName])无法区分0和''这种等效于假值的值
$params[$paramName] = $param;
# 由于,$params中的值已经定义过了,所以此处赋值并不会影响其顺序
}
} call_user_func('test', $params);
# 或者call_user_func_array([$class, 'method'], $params);

PHP如何动态传入参数的更多相关文章

  1. 动态sql语句和动态传入参数个数

    1.可以将要传入的几个参数封装成一个实体类,然后将实体类作为一个参数传入到相应的方法中,这时候就需要这sqlMapper.xml文件中对传入的字段利用<if test=""& ...

  2. RF--执行案例时动态传入参数方法

    通过在运行界面的设定-v 参数值来动态传入:

  3. mybatis 框架动态传入参数${}和#{}之间的区别

    动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理.下面让我们先来熟悉下myb ...

  4. 根据Webservice地址,动态传入参数(Webservice代理类)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sunlib; ...

  5. [转]MyBatis动态传入表名、字段名参数的解决办法

    一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...

  6. MyBatis动态传入表名,字段名参数的解决办法---statementType用法

    statementType="STATEMENT" 要实现动态传入表名.列名,需要做如下修改 添加属性statementType="STATEMENT" 同时s ...

  7. Oracle列转行 参数动态传入iBatis使用示例

    Oracle行转列 参数动态传入iBatis使用示例 最近做了一个需求,需要获取工作流数据的各个节点的渠道数量信息,各渠道的费用信息~ 之前的需求是只需要获取渠道数据,所以做了渠道兼容,每个渠道数量的 ...

  8. springboot 之 根据传入参数进行多数据源动态切换

    背景:最近有一个需求是根据app传来的请求参数,根据行政部门编码请求不同地区的数据,之前写的多数据源都是固定某个方法调用指定的dao然后查询不同的数据库,但是这次是需要根据前端传入参数进行动态区分数据 ...

  9. MyBatis动态传入表名,字段名参数的解决办法

    原文:http://blog.csdn.net/xichenguan/article/details/50393748 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=& ...

随机推荐

  1. Bitmap(三)

    转自:http://www.open-open.com/lib//view/open1333418945202.html Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文 ...

  2. windows 清理利器

    https://www.ccleaner.com/ 2. https://www.chuyu.me/zh-Hans/index.html

  3. rayleighchan实现瑞利多径衰落信

    rayleighchan实现瑞利多径衰落信道 1.命令格式: chan = rayleighchan(ts,fd,tau,pdb) 其中: ts—为输入信号的采样周期, fd—就是Doppler频偏, ...

  4. day_5.17 飞机大战

    ps:2018-7-24 20:58:11 重新整理这个飞机大战源码,我虽然这个时候没看源码,但是知道思路的话用其他语言还是可以写出来的! ''' 2018-5-13 19:53:46 完善成功 一个 ...

  5. Django----认证系统和auth模块

    COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...

  6. GDB常用调试命令以及多进程多线程调试

    http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令   1.list命令 list  linenum      显示程序第l ...

  7. day3 三、基本数据类型和运算符

    一.多行注释和单行注释 """ 多行注释 多行注释 多行注释 """ # 单行注释 # print('hello world') # pri ...

  8. asp.net core 1.1 项目升级至 asp.net core 2.0 preview 2 与正式版

    这两天把一个 asp.net core 1.1 的项目迁移到了 asp.net core 2.0 preview 2 ,在这篇随笔中记录一下. 如果项目在有 global.json 文件,需要删除或修 ...

  9. oracle的存储过程

    plsql中执行无参数存储过程格式: begin tttttttttttttt;end; 在执行记录表中 select *from v$sqlarea t where t.sql_text like ...

  10. [No0000143]Win10“卓越性能模式”

    从不久之前Win10更新1803以来,微软不仅带来了一些新功能(和BUG),还悄悄地加入了一个“卓越性能模式”,老张想了想,不对呀,以前就有了一个“高性能模式”,这怎么就还多出个新的性能模式来,难道会 ...