Php 简化调试

Php 简化调试,php,Php,有没有办法实现以下目标 $myvar = 'x'; debug($myvar); // outputs the following // myvar value is x 显然,要实现这一点,调试函数需要能够获得传递给它的变量名 有一个神奇的常数吗? 如果没有,请推荐可以简化调试的替代方法 当然,我知道有一个选项,可以将变量名作为单独的参数传递 debug('myvar',$myvar); 但我的目标恰恰是避免这样做 var_dump($my_var); 显示全局范围内变量的变量名

有没有办法实现以下目标

$myvar = 'x';
debug($myvar); 

// outputs the following 
// myvar value is x
显然,要实现这一点,调试函数需要能够获得传递给它的变量名

有一个神奇的常数吗? 如果没有,请推荐可以简化调试的替代方法

当然,我知道有一个选项,可以将变量名作为单独的参数传递

 debug('myvar',$myvar);
但我的目标恰恰是避免这样做

var_dump($my_var);

显示全局范围内变量的变量名及其值 是的,有,但您需要传递名称:

函数调试($var\u name){
printf('%s值为%s',$var_名称,var_导出($GLOBALS[$var_名称],true));
}
或者,如果只需要不带可解析格式的值:

函数调试($var\u name){
printf('%s值为%s',$var\u name,$GLOBALS[$var\u name]);
}
显示局部范围内变量的变量名及其值 注意:这只适用于全局范围内的变量。要对本地作用域执行同样的操作,您可能需要一个采用
get\u defined\u vars()
的解决方案,如下所示:

printf('%s value is %s', $var_name, get_defined_vars()[$var_name]);
这不能简单地包含在
debug()
函数中。这是因为
get\u defined\u vars()
返回数组,表示调用
get\u defined\u vars()
的作用域中的变量,我们不需要定义
debug()
的作用域,不是吗

统一解 统一解决方案可以使用全局范围作为默认值,但也可以接受一些表示本地范围的数组,因此定义可以是:

函数调试($var\u name,$scope\u vars=null){
if($scope_vars===null){
$scope_vars=$GLOBALS;
};
printf('%s值为%s',$var\u name,var\u export($scope\u vars[$var\u name],true));
}
然后你可以在全局范围内这样称呼它:

debug('myvar');
或类似于在本地作用域中,传递本地作用域数组:

debug('myvar',get_defined_vars());
工作示例 有关工作示例,请参见本演示:

这有帮助吗?

这被认为是一种非常低效的方法,至少有四个原因:添加和删除调试代码会浪费时间,调试代码会减慢web速度,不仅是调试过程,调试完成后还会忘记删除代码,查找和分析结果需要时间——您可以在服务器上的连续日志中看到它们。
更好的方法是安装特殊的调试器扩展,并从为php集成的IDE中使用代码。还有一个很棒的Google Chrome扩展,它允许:

  • 请参阅Chrome JavaScript控制台和通知弹出窗口中的错误和异常
  • 转储任何类型变量
  • 远程执行PHP代码
  • 通过密码保护访问
  • 按请求对控制台日志进行分组
  • 跳转到文本编辑器中的错误文件:行
  • 将错误/调试数据复制到剪贴板(用于测试人员)

推荐大家

使用print\u r($var)或var\u dump($var)再简单不过了,也请不要使用不相关的标签
exec
eval
@lawrence,我之所以添加exec或eval,是因为使用这些标签可能有解决办法。此外,print_r和var_dump都不会让您看到传递的变量的名称。您可以扩展PHP引擎。尝试过它,但不起作用。varname或值失败。@JohnSmith:请解释一下“不工作”的确切含义。这个函数的工作原理与您提到的完全一样,只需要传递名称,而不是我提到的整个变量。看看这个例子:这个解决方案必须适用于所有变量。。。否则,这是一种脑力劳动,试图思考你是在一个函数中还是在全局范围内,var是否是全局定义的,等等。。。您编写的localscope示例超出了目的。因为键入get_defined_vars()比键入“myvar”花费更多的时间。我感谢你为解决这个难题所做的努力。但仍然没有解决办法。我想这是不可能的。@JohnSmith:我相信你再也做不到了。对于全局变量,它可以完美地工作,但局部变量需要您做更多的工作。但如果您正在调试某个东西,我想键入“
get_defined\u vars()
”(或将其分配给
$v
变量,然后在后续的
debug()
调用中使用,甚至迭代变量名数组)比刷新显示应用程序的窗口要短。不幸的是,如果您想要更多功能,则需要更改语言;)PHP不会传递带有变量的名称,因为并非所有的名称都是对象(所以您不能将名称存储在其中)。tadeck,我将再次尝试您的代码,看看我能用它做些什么。明天左右,我会把我的发现告诉你。我得走了。