• 首先需要说明的是,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. js替换元素与设置时间间隔

    var lastReportTime = 0; //设置时间间隔 window.onload = function(){ setInterval(handleRefresh, 3000); } fun ...

  2. Ubuntu下SSH无密码验证配置

    前言 SSH为Secure Shell 的缩写,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.越来越多的小伙伴们使用远程登录,而ssh安全性无疑是很高的,那么我们现在来看看如何实现ss ...

  3. MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】

    1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点;  1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系.  2. 视 ...

  4. scala 可变集合与内存清理的关系

    留坑待填 使用scala.collection.mutable._期间,发现了当程序运行内存开销较多时,使用系统工具进行内存清理,然后程序报出了变量找不到.内存无法访问.数组访问越界,堆栈溢出等多种错 ...

  5. 【react】---styled-components的基本使用---【巷子】

    一.官网地址 https://www.styled-components.com/ 二.styled-components 1.styled-components 样式化组件,主要作用是它可以编写实际 ...

  6. ubuntu部署php7.1

    先更新本机内置的程序. sudo apt-get updatesudo apt-get upgrade 安装PHP sudo add-apt-repository ppa:ondrej/php sud ...

  7. Error creating bean with name 'eurekaAutoServiceRegistration'

    spring-boot项目不断重启,报错: org.springframework.beans.factory.BeanCreationNotAllowedException: Error creat ...

  8. win server 2008添加磁盘-脱机转换为联机状态方法

    解决方案如下: 1.运行:cmd2.输入:DISKPART3.DISKPART> san4.DISKPART> san policy=onlineall5.DISKPART>list ...

  9. HTML5:基本语句

    HTML5:超文本标记语言(HTML)第五次重大修改 我用的sulime编辑器,用Package contorl后安装emmet插件来编辑HTML代码,以下为sublime操作小技巧 ctrl+s 保 ...

  10. MVC 实用构架实战(一)——项目结构搭建

    一.前言 在<上篇>中,已经把项目整体结构规划做了个大概的规划.在本文中,将使用代码的方式来一一解说各个层次.由于要搭建一个基本完整的结构,可能文章会比较长.另外,本系列主要出于实用的目的 ...