You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何获取动态变量的变量名?自定义varName函数失效求助

解决动态变量名获取及变量值含自身名称的问题

咱们先搞定第一个问题:怎么获取${'tell'.$var.'How'}这种动态变量的名称,以及为什么你之前的varName()函数失效了。

一、获取动态变量的名称

你之前用的varName()函数失效,核心原因是它的正则表达式#\$(\w+)#只能匹配$var这种简单的变量写法,而${'tell'.$var.'How'}是复杂的动态变量语法,正则根本匹配不到这个格式,自然拿不到变量名。

解决这个问题最靠谱的方法其实很简单——既然变量名是你自己用字符串拼接出来的,直接把这个拼接结果存起来就行,完全不需要用函数去“猜”:

<?php
$var = 'Me';
// 先把动态变量名存到一个普通变量里
$dynamicVarName = 'tell' . $var . 'How';
// 用这个变量名赋值
${$dynamicVarName} = 'Thanks!';
// 直接用$dynamicVarName就是我们要的变量名
echo 'Variable name: $' . $dynamicVarName . ' = ' . ${$dynamicVarName};
// 输出结果:Variable name: $tellMeHow = Thanks!
?>

如果你一定要用函数的方式(不推荐,因为复杂且容易出错),可以修改正则来匹配${...}的格式,但还要处理里面的字符串拼接逻辑,比如:

<?php
function getDynamicVarName($expr) {
    $trace = debug_backtrace();
    $line = file($trace[0]['file'])[$trace[0]['line'] - 1];
    // 匹配${...}里的内容
    preg_match('#\$\{(.+?)\}#', $line, $matches);
    if (!isset($matches[1])) return '';
    // 计算拼接表达式的值
    return eval("return {$matches[1]};");
}

$var = 'Me';
${'tell'.$var.'How'} = 'Thanks!';
$name = getDynamicVarName(${'tell'.$var.'How'});
echo 'Variable name: $' . $name . ' = ' . ${'tell'.$var.'How'};
?>

不过这种方法有风险,eval()函数可能带来安全问题,而且如果拼接表达式更复杂(比如包含函数调用),很容易出错,所以还是推荐第一种手动保存变量名的方式。

二、变量值等于自身变量名的情况

当然存在这种情况,不过你示例里的varName()调用没有传参,肯定会报错。要实现变量值里包含自身的变量名,同样有两种方式:

1. 手动保存变量名(最可靠)

<?php
$varName = 'var';
// 用可变变量赋值,值里直接用保存的变量名
$$varName = "is my name $varName?";
echo $$varName; // 输出:is my name var?

$why = 'Why ' . $$varName;
echo $why; // 输出:Why is my name var?
?>

2. 通过函数自动获取变量名(有局限性)

可以写一个函数,通过debug_backtrace()获取调用它的代码行,匹配赋值语句左边的变量名:

<?php
function getCurrentVarName() {
    $trace = debug_backtrace();
    $callerLine = file($trace[0]['file'])[$trace[0]['line'] - 1];
    // 匹配赋值语句左边的变量名,比如$var = ...
    preg_match('#^\s*\$(\w+)\s*=#', $callerLine, $matches);
    return $matches[1] ?? '';
}

$var = "is my name " . getCurrentVarName() . "?";
echo $var; // 输出:is my name var?

$why = 'Why ' . $var;
echo $why; // 输出:Why is my name var?
?>

这种方法的局限性是:如果赋值语句不是单独一行、或者写法不规范(比如在括号里赋值),正则就匹配不到变量名了,所以还是手动保存的方式更稳妥。

内容的提问来源于stack exchange,提问作者Wobbo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:36:18