PHP获取变量的变量名的一段代码的bug

百度一下关于PHP获取变量名的办法都是下面这个函数。但是用了发现有点bug

/**
* 获取变量名
*
* @param $string
* @return $string
*
* $test = helo;
* $test2 = helo;
* getvarName($test2);
*/
function getvarName(&$src){
//存储当前变量值
$save = $src;
//存储所有变量值
$allvar = $GLOBALS;
//在函数中不要直拉遍历$GLOBALS,会出现堆栈问题
foreach($allvar as $k=>$v){
//变量值相同,可能不是相同变量,因多个变量的值可能相同
if ($src == $v){
//改变当前变量$src的值
$src = 'change';
//如果$GLOBALS[$k]也跟着改变,那就是同一个变量。
if ($src == $GLOBALS[$k]){
//echo $$k name is $k
;
//还原变量值
$src = $save;
return $k;
}
}
}
}
copy下来后发现这个怎么测试结果有时候对有时候不对,想了很久,终于弄明白,虽然很简单,但是自己还是记录下,希望遇到同样情况的同学注意。

比如:现在我测试

$test2 = hello;
$countNum=0;
echo getvarName($test2);
//按道理应该输出为”test2“,但是输出的是countNum,
因为函数中的
if ($src == $v) 这里存在问题 比如$src=hello, $GLOBALS里面有个变量$countNUm=0;

这时在循环的时候判断 if ($src == $v) ,即hello==0,比较的结果为true,类型转换的时候“hello“转为整形为0,

然后就退出循环了,得到错误的结果。

一个解决办法就是 if ($src == $v) 改为 if($src===$v),即恒等。

如果我理解错了欢迎您指正,一起进步。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...