2009-09-24 84 views
1

当我使用智能::在Perl评论,我能看到的哈希的名字我倾倒(即%的人,下同)。 。 。什么PHP函数将打印一个数组的名称及其内容?

[[email protected] ~]$ cat /tmp/person.pl 
#!/usr/bin/perl 
use strict; 
use warnings; 
use Smart::Comments; 
my %person = (
    'hair' => 'golden', 
    'eyes' => 'blue', 
); 
### %person 
[[email protected] ~]$ perl /tmp/person.pl 

### %person: { 
###   eyes => 'blue', 
###   hair => 'golden' 
###   } 
[[email protected] ~]$ 

。 。 。但在PHP中,我只看到“Array”,没有提及$ person。 。 。

[[email protected] ~]$ cat /tmp/person.php 
<?php 
$person = array(
    'hair' => 'golden', 
    'eyes' => 'blue', 
); 
print_r($person); 
[[email protected] ~]$ php /tmp/person.php 
Array 
(
    [hair] => golden 
    [eyes] => blue 
) 
[[email protected] ~]$ 

我试过print_r()var_export(),并var_dump()但有一些其他的PHP函数,将打印其内容的数组的名字吗?

回答

2

其实,这是可能的,但在一个非常hackish的方式。您可以使用debug_backtrace()来获取从哪个运行函数调用的行的编号(当然还有文件名)。这样就可以解析该行来找出表达(如$myArray),将其进行评估(例如,以array(1, 2, 3))并传递给正在执行的功能。但是,如果不使用Tokenizer这样复杂的解决方案,找到表达式的开始和结束位置并不容易。

。假定该getArgumentExpressionAsString()已经实现了“倾销”的功能应该是这样的:

function dump($arg) 
{ 
    $backtrace = debug_backtrace(); 
    $expression = getArgumentExpressionAsString($backtrace[0]); 
    echo "$expression:"; 
    var_dump($arg); 
} 

编辑。的范例:

function getArgumentExpressionAsString($backtrace) 
{ 
    $allLines = file($backtrace['file']); 
    $line = $allLines[$backtrace['line'] - 1]; 
    $function = $backtrace['function']; 
    return preg_replace("/.*{$function}\((.*)\).*/", '$1', $line); 
} 

function dump($arg) 
{ 
    $backtrace = debug_backtrace(); 
    $expression = getArgumentExpressionAsString($backtrace[0]); 
    echo "$expression:\r\n"; 
    var_dump($arg); 
} 

$arr = array(1, 2, 3); 

dump($arr); 

输出将是:

$arr:array(3) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
} 
3

在PHP的变量名只是为了实际数组的引用。可以有多个引用相同数组的变量。因此无法找到数组的名称。

3

你将不得不单独打印变量的名字,很可惜。 你可以在自己的函数把这个包起来,使其更容易:

function print_r_WithName($varName,$return=FALSE){ 
    $retVal=''; 
    if(!$return){ 
    print "$varName:"; 
    } 
    else{ 
    $retVal=$varName.':'; 
    } 

    $retval.=print_r($$varName,$return); 

    return $retVal 
} 

,然后把它作为

print_r_WithName("person"); 

//output: 
person:Array 
(
    [hair] => golden 
    [eyes] => blue 
) 
+0

确认,打我给它。还有一个更好的例子。 +1。 – NateDSaint 2009-09-24 17:16:16

+0

我认为通过函数的'返回'路径缺少varName和print_r()之间的冒号。好例子。 +1。 – drewm 2009-09-24 18:52:14

1

由于JW已指出,PHP(如JavaScript,因为我最近才发现)传递数组中的数据以便var_dump访问,但它不传递该引用名称。由于语言是结构化的,如果不通过对该函数的引用,就没有真正的方法来知道该名称。里面的数据知道有多少引用,但它无法知道你想要哪一个(包括在解析期间在幕后进行的任何原型和构造)。

然而,这里是我使用的(在胁迫下)来获取信息的GODAWFUL HACK。

function AwesomeDump($data, $reference=null) 
    { 
    $myreturn = ""; 
    if ($reference) { $myreturn = $reference;} 
    $myreturn .= var_dump($data); 
    return $myreturn; 
    } 

在这种情况下要执行它,你需要提供参考名称作为第二个参数指定您希望它有哪个名字。它默认为null,所以它只适用于我的var_dump,除非你另有指定。

0

你不能,有没有这样的事情,因为这智能::在PHP评论。

如果你想跟踪变量值,那么你应该使用调试器,像xdebug

相关问题