2009-09-24 48 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