zoukankan      html  css  js  c++  java
  • PHP如何动态传入参数

    • 首先需要说明的是,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);
  • 相关阅读:
    JS 录音
    JS学习笔记 之 作用域链
    JS学习笔记 之 预编译
    JS学习笔记 之 递归
    JS学习笔记 之 函数声明
    JS学习笔记 之 隐式类型转换
    JS学习笔记 之 typeof
    JS学习笔记 之 for循环
    JS学习笔记 之 运算符
    JS学习笔记 之 数据类型
  • 原文地址:https://www.cnblogs.com/jiangxiaobo/p/10077845.html
Copyright © 2011-2022 走看看