• 首先需要说明的是,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. POJ 3249 Test for Job

    Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13457 Accepted: 3100 Descrip ...

  2. jmeter中split分隔字符

    jmeter中自带了split函数,但是,注意但是,不能使用"-",","等等符合,否则会报错. 没办法,转投入beanshell的怀抱,使用split,发现& ...

  3. 使用python删除一个文件或文件夹

    使用python删除一个文件或文件夹,需要使用os模块. import osos.remove(path) # path是文件的路径,如果这个路径是一个文件夹,则会抛出OSError的错误,这时需用用 ...

  4. 查找C++代码中某一范围内的内存泄露

    #include <string.h> #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> int _tmain(int argc, _ ...

  5. .NET Core开发日志——Edge.js

    最近在项目中遇到这样的需求:要将旧有系统的一部分业务逻辑集成到新的自动化流程工具中.这套正在开发的自动化工具使用的是C#语言,而旧有系统的业务逻辑则是使用AngularJS在前端构建而成.所以最初的考 ...

  6. c++基本函数

    std::abs 求绝对值函数 double abs (double x); float abs (float x); long double abs (long double x); std::sw ...

  7. tomcat运行模式

    Tomcat Connector的三种不同的运行模式性能相差很大 这三种模式的不同之处如下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomcat7或以下,在Linu ...

  8. MySQL之更新型触发器

    DELIMITER || CREATE TRIGGER tri_video_class AFTER UPDATE ON 数据库名.表名称 FOR EACH ROW begin IF((old.stat ...

  9. [cloud][OVS][sdn] Open vSwitch 初步了解

    What is Open vSwitch? Open vSwitch is a production quality, multilayer virtual switch licensed under ...

  10. AndroidStudio_ListView

    在这里梳理一下ListView的用法: 1.建立一个activity,例如建立一个ListViewActivity,这时将生成两个文件:ListViewActivity.java和activity_l ...