当我在Perl中使用Smart :: Comments时,我可以看到我正在转储的哈希的名称(即下面的%person)。 。
[pdurbin@macbook ~]$ cat /tmp/person.pl
#!/usr/bin/perl
use strict;
use warnings;
use Smart::Comments;
my %person = (
'hair' => 'golden',
'eyes' => 'blue',
);
### %person
[pdurbin@macbook ~]$ perl /tmp/person.pl
### %person: {
### eyes => 'blue',
### hair => 'golden'
### }
[pdurbin@macbook ~]$
。 。 。但在PHP中我只看到“数组”,没有提到$ person。 。
[pdurbin@macbook ~]$ cat /tmp/person.php
<?php
$person = array(
'hair' => 'golden',
'eyes' => 'blue',
);
print_r($person);
[pdurbin@macbook ~]$ php /tmp/person.php
Array
(
[hair] => golden
[eyes] => blue
)
[pdurbin@macbook ~]$
我已经尝试了print_r()
,var_export()
和var_dump()
但是还有其他PHP函数会打印带有内容的数组名称吗?
答案 0 :(得分:3)
PHP中的变量名只是对实际数组的引用。可以有多个引用同一数组的变量。因此,无法找到 数组的名称。
答案 1 :(得分: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
)
答案 2 :(得分: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 :(得分: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。
答案 4 :(得分:0)
你不能,PHP中没有Smart :: Comments这样的东西。
如果要跟踪变量值,则应使用调试器,如xdebug