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>';
}