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
相关产品推荐
相关产品推荐

