php 获取配置参数名称,php可变参数可以取得具体的参数名称吗

如果你一定要这样做的话,也不是不可以。

首先使用 debug_backtrace() 拿到调用栈,array_shift() 取出来,拿到文件,然后把文件交给 php-parser 找到调用的位置,就可以通过 php-parser 拿到了。<?php

require __DIR__ . '/vendor/autoload.php';

use PhpParser\ParserFactory;

/**

* 获取调用函数的参数

*

* @param array $backtrace debug_backtrace

* @param string $func 要查找的函数名字

*

* @return array 返回调用的参数,如果是变量,就返回变量名,如果不是变量是值,就返回序列号,从参数索引 0 开始编号

*/

function getCallFuncArgs(array $backtrace, string $func): array

{

// 获取调用栈中第一个

$caller = array_shift($backtrace);

// 取出文件

$file = $caller['file'];

// 创建解析器

$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);

$code = file_get_contents($file);

// 解析代码

$ast = $parser->parse($code);

$nodeFinder = new \PhpParser\NodeFinder();

// 查找所有的函数调用

$nodes = $nodeFinder->findInstanceOf($ast, \PhpParser\Node\Expr\FuncCall::class);

$argList = [];

foreach ($nodes as $node) {

// 找到函数名跟要查找的一致的

if (($node->name->parts[0] ?? null) === $func) {

// 创建索引值

$i = 0;

// 遍历所有参数

foreach ($node->args as $arg) {

// 如果是变量,就取变量名

if ($arg->value instanceof \PhpParser\Node\Expr\Variable) {

$argList[] = $arg->value->name;

} else {

// 否则就编号

$argList[] = '#' . $i;

}

$i++;

}

}

}

return $argList;

}

function testA()

{

// 调用

$keys = getCallFuncArgs(debug_backtrace(), __FUNCTION__);

// 填充一个关联数组,创建关系

$combine = array_combine($keys, func_get_args());

var_dump($combine);

}

$a = 1;

$b = 2;

$c = 2;

testA($a, $b, 1, 2, 3, 4, $c);

上面的代码输出就像这样:

bVcNve6

当然,这只是实现的一种思路,如果要用到业务中,还是做好多方面的测试工作,以免出现意外情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值