博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP如何动态传入参数
阅读量:5754 次
发布时间:2019-06-18

本文共 1295 字,大约阅读时间需要 4 分钟。

  • 首先需要说明的是,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的回答作为示例:

  • 下面上代码:

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);

 

转载地址:http://qockx.baihongyu.com/

你可能感兴趣的文章
第三章 Python 的容器: 列表、元组、字典与集合
查看>>
微信小程序开发 -- 点击右上角实现转发功能
查看>>
问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7
查看>>
与MS Project相关的两个项目
查看>>
[转载]ASP.NET MVC Music Store教程(1):概述和新项目
查看>>
使用 SharpSvn 执行 svn 操作的Demo
查看>>
js函数大全
查看>>
iOS app exception的解决方案
查看>>
Mongodb启动命令mongod参数说明
查看>>
TCP&UDP压力测试工具
查看>>
oracle 导入数据
查看>>
Android 最简单的自定义Dialog之一
查看>>
磨刀不误砍柴 - 配置适合工作学习的桌面环境
查看>>
Java笔记-反射机制(一)
查看>>
redux v3.7.2源码解读与学习之 applyMiddleware
查看>>
【React】为什么我不再使用setState?
查看>>
Git原理与高级使用(3)
查看>>
从JDK源码看Writer
查看>>
Express 结合 Webpack 实现HMRwi
查看>>
基于protobuf的RPC实现
查看>>