2013-04-10 150 views
-2

我想为调试目的制作一个小功能,以可读的格式打印变量的内容。PHP - 如何获取变量的名称?

该功能是基于CakePHP的框架中发现的pr()快捷方式,即this one

我有这个至今:

function pr($var,$msg){ 
    $pr_debug=true; 
    if($pr_debug){ 
     echo "<pre>"; 
     if($msg) echo "<b>".$msg.": </b>"; 
     if(gettype($var)=="array" || gettype($var)=="object") echo "<br>"; 
     print_r($var); 
     echo "</pre>"; 
    } 
} 

它打印内容的变量之前的可选消息($ MSG) 。

但我想补充一下,就是如果没有发送消息,同时打印变量的名称为这样的消息,所以我能得到这样的事情:

$myvar="hello"; 
pr($myvar); 

//应该输出:

myvar: hello 

所以在我的函数中,我怎样才能得到变量的名称作为一个字符串,所以我可以输出它? 即与pr($foo);我需要"foo"$name="biz"; pr($$name);我需要"biz", 等等...

最好我想要的东西,尽管PHP全局配置或任何的那个(其中的方式,我不十分了解,将工作好吧,所以对GLOBALS的任何帮助将非常感激)。

谢谢!

额外:在这里在stackoverflow,我如何格式化源代码来获取PHP格式和颜色?截至目前,我simpy使用工具栏在textarea,并选择“代码示例”...

+1

您应该接受一个字符串作为输入而不是变量,然后使用'$$ var'获取变量的值并使用'$ var'获取名称的变量。 – 2013-04-10 20:20:04

+1

认识到当你有一个函数'function foo($ a)'时,'$ a'最初可能是函数,代数表达式,文字值或任何未命名的东西的返回值变量。 – 2013-04-10 20:25:02

+0

我试图概述一些为什么这是不是这样一个有用的想法对老问题的一些原因:http://stackoverflow.com/a/15936154/157957 – IMSoP 2013-04-10 21:05:50

回答

0

你想要的是变量变量......但事实上,你不希望他们。他们几乎一样糟糕,在现代编程“转到”:

$foo = 'bar'; 
$baz = 'foo'; 
echo $$baz; // bar 
    ^^-- note the doubled $'s 

问题是,当你到达你的调试代码的时候,该varaible的名字“源”已丢失,例如

function debug($out) { 
    global $$out; 
    echo $out, ': ', $$out; 
} 

$foo = 'bar'; 
debug($foo); 

这不会输出“foo”作为名称,因为名称'$ foo'没有传递给函数。只有$foo的值,即bar进去。

+0

但如果不是调用调试($ foo)我将其称为调试(“foo”),然后它将按预期工作,并回显“foo:bar”,这正是我想要的!所以,我不需要直接将$ var作为参数传递,而只需要修改我的函数以接收变量的NAME(字符串),然后将其与$$一起用于获取它的内容。我对吗? – DiegoDD 2013-04-10 21:31:22

+0

是的,但请记住,在该函数内,该变量反正会超出范围。 – 2013-04-10 22:48:41