什么PHP函数将打印带有内容的数组名称?

时间:2009-09-24 17:02:51

标签: php

当我在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函数会打印带有内容的数组名称吗?

5 个答案:

答案 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