Php 如何改进var_dump以显示变量名并将变量值放入<;pre>;?

Php 如何改进var_dump以显示变量名并将变量值放入<;pre>;?,php,Php,我在脚本中多次使用var\u dump()函数来检查变量的实际值和类型。很长一段时间以来,函数vardump()的定义如下: function vardump($_var){ echo '<pre>'; var_dump($_var); echo '</pre>'; } 函数vardump($\u var){ 回声'; 变量转储(美元变量); 回声'; } 但今天我已经在很多地方多次使用它,以至于我弄糊涂了我要真正检查的whitch变量。 所以

我在脚本中多次使用
var\u dump()
函数来检查变量的实际值和类型。很长一段时间以来,函数
vardump()
的定义如下:

function vardump($_var){
    echo '<pre>';
    var_dump($_var);
    echo '</pre>';
}
函数vardump($\u var){
回声';
变量转储(美元变量);
回声';
}
但今天我已经在很多地方多次使用它,以至于我弄糊涂了我要真正检查的whitch变量。
所以问题是如何确定我当前正在检查的值的名称?

在整个上午的搜索之后,我找到了以下解决方案:

vardump($variable_name, get_defined_vars());
get_defined_vars()
此函数返回一个多维数组,其中包含调用get_defined_vars()的范围内所有已定义变量的列表,这些变量可以是环境变量、服务器变量或用户定义变量

我将对代码进行更多的解释,其中使用了一些奇特的函数

function vardump($_var){
    echo '<pre>';
    var_dump($GLOBALS[$_var]);
    echo '</pre>';
}

vardump("foo");
因为我已经更改了
$\u var
值数组
$aDefinedVars\u 0
$aDefinedVars
是相同的,只是
$\u var
值不同(注意
$aDefinedVars\u 0
不要引用变量,所以我没有影响
$aDefinedVars\u 0

现在,
array\u diff\u assoc
函数将
$aDefinedVars\u 0
$aDefinedVars
(具有更改的
$\u var
值)进行比较,并返回与is关联数组(仅包含一个位置
$\u var
名称和
$\u var
值的数组)的差异

array\u keys
函数从输入数组返回键,数字和字符串(并且输入数组只包含一个我要查找的位置)

$\u var=$iVarSave;//现在我可以恢复旧的$\u var值
$name=$aDiffKeys[0];//$_变量的名称位于$aDiffKeys数组的第一个(也是唯一的位置)上
}否则{//有人不会使用get_defined_vars()
$name='variable';
}
回声';
echo$name.':';
变量转储($变量);//它可以通过print\u r($\u var)进行更改;
回声';
}

另外,我的英语很抱歉。

您无法以字符串形式获取变量名。您可以使用中描述的方法,但如上所述,它并不完美

我认为最好的选择是将其添加到您自己的列表中,或者使用globals并将var名称作为strting传递

函数vardump($\u var){
回声';
var_dump($GLOBALS[$_var]);
回声';
}
vardump(“foo”);

由于
vardump
的参数可能是一个表达式而不是一个变量,因此这是您可以得到的最接近的参数:

函数vardump($\u变量,$\u标签){
回声';
如果(!空($\标签)){
echo$_标签。“:”;
}
变量转储(美元变量);
回声';
}

我想推荐一个名为dump\r的php类。这个类以不同的颜色显示信息,它是var_vump和print_r的组合。你可以在phpclasses.org上找到它


我在互联网上看到许多奇怪的脚本来解决您的问题或类似的问题

平庸地说,我认为最好的方法是将变量名作为字符串参数传递,如果需要,可以缩短:

函数vardump($\u var,$var\u name){
echo“变量$var_name:”;
变量转储(美元变量);
回声';
}

这不是很快,但它是一个很好的解决方案。

这几乎是不可能的,因为在一个不使用原始变量的函数中,您使用的是一个名为
$\u var
:)的克隆。是的,这是正确的检查我的答案,我在那里使用
&$\u var
。是的,这几乎是最好的方法。不推荐(因为存在明显的问题(在脚本中返回30个空变量名/不适用于类属性),但很有意思。@JanDvorak:问题出在哪里?这就像讨论自杀的最佳方式。你会发现的,但你不会推荐任何人这么做:)让我重新措辞:“这是最好的方法,但它不是很可靠,所以你不应该使用它)。“你到底为什么要用这样的东西?如果发送第二个参数是一个选项,为什么不只发送变量名呢?@HugoDelsing询问者在将调用复制到vardump时懒得更改参数;-)那么我很高兴你没有为我工作。如果你懒得调试,我甚至不想知道你还懒得调试什么:0 Hanks for link稍后会检查它。实际上它很快(比我的解决方案快得多),但正如我前面所说,我懒得贴标签:)@bumerang只要你复制它,你仍然需要更改调用,是吗?@bumerang您可以使用正则表达式替换一次性更改所有事件。你想要正则表达式吗?@Jan Dvorak是的,这是真的,我必须改变它-不幸的是;)。我对正则表达式不太熟悉:(Bumerang,我认为这是最好的方法…我知道,贴标签这并不好笑,但我认为它仍然比创建一个昂贵、长且奇怪的函数来完成这项任务要好!:-)这是我开始的地方,但我使用了评论公认答案的链接:
/**
 * Functions that will display name of the variable, and it's value, and type
 * 
 * @param type $_var - variable to check
 * @param type $aDefinedVars - Always define it this way: get_defined_vars()
 * @return type
 */
function vardump(&$_var, &$aDefinedVars = null){
    // $aDefinedVars - is array of all defined variables - thanks to get_defined_vars() function
    if($aDefinedVars){
        // loop below is used to make a copy of the table of all defined variables
        foreach ($aDefinedVars as $k=>$v)
            $aDefinedVars_0[$k] = $v; // this is done like that to remove all references to the variables
        $iVarSave = $_var; // now I copy the $_var value to another variable to prevent loosing it
        $_var     = md5(time()); // completly random value
        // and the most tricky line
        $aDiffKeys = array_keys (array_diff_assoc ($aDefinedVars_0, $aDefinedVars));
        $_var      = $iVarSave; // now I can restore old $_var value
        $name      = $aDiffKeys[0]; // name of the $_var is on the first (and the only position) in the $aDiffKeys array
    }else{ // is someone won't use get_defined_vars()
        $name = 'variable';
    }

    echo '<pre>';
    echo $name . ': ';
    var_dump($_var); // it can be changed by print_r($_var);
    echo '</pre>';
}
function vardump($_var){
    echo '<pre>';
    var_dump($GLOBALS[$_var]);
    echo '</pre>';
}

vardump("foo");
function vardump($_var, $_label){
    echo '<pre>';
    if(!empty($_label)){
      echo $_label . ': ';
    }
    var_dump($_var);
    echo '</pre>';
}
function vardump($_var, $var_name){
echo '<pre> Variable <b>$var_name</b>: ';
var_dump($_var);
echo '</pre>';
}