2012-06-14 45 views
1

我希望能夠輸出變量的名稱以及該變量的值。我的用例與調試情況很接近,但我實際上爲其他開發人員和管理人員構建了一個概念證明,所以我們可以討論輸入過濾等問題。無論如何...輸出變量名及其值(在函數中)

輸出HTML目前是一個表,但這應該不重要。當然,我可以打印出名稱,然後打印出HTML中的內容,但這會變得單調乏味,而且很容易出現輸入錯誤。我想要一個函數,我可以調用變量名稱或變量名稱作爲參數的字符串,並讓該函數生成適當的HTML用於顯示。這似乎不起作用。

這工作:

<tr><td>$variable</td><td><?php print $variable?></td></tr> 

這不:

function rowFromVar($varname) { 
    $result = "<tr>"; 
    $result .= "<td>\$$varname</td>"; 
    $result .= "<td>" . $$varname . "</td>"; 
    $result .= "</tr>"; 
    return $result; 
} 
// now in the HTML... 
<table><?php print rowFromVar("variable");?></table> 

變量變量$$varname總是空的。請注意,我將變量的名稱作爲字符串傳遞,而不是嘗試傳遞變量本身並使用它。我知道there be dragons那樣。相反,我試圖將變量的名稱作爲字符串傳遞,然後使用變量變量(是的,我知道)返回原始變量的值。這看起來不起作用,我敢打賭這是一個範圍問題。

有沒有什麼好方法可以完成我要找的東西?

+1

您的原始變量超出了函數內的範圍,您還需要傳遞實際變量以及 –

+0

爲什麼使用double $$?在這種情況下$ varname而不是$$ varname –

+0

您是否曾嘗試在函數的開頭添加'global $$ varname;'? – megaflop

回答

0

您需要在函數中聲明變量global,以便它引用全局版本。在你的函數的開始加入這一行應該解決的問題:

function rowFromVar($varname) { 
    global $$varname; 
    $result = "<tr>"; 
    $result .= "<td>\$$varname</td>"; 
    $result .= "<td>" . $$varname . "</td>"; 
    $result .= "</tr>"; 
    return $result; 
} 
1

變量變量$$ varname始終爲空。請注意,我 傳入變量的名稱作爲一個字符串,而不是試圖 傳中,變量本身和與之

工作,它應該是空的

既然你傳遞variable作爲值,所以:

$$varname 

變爲:

$variable 

並且沒有爲它設置。

換句話說,您只是創建一個名稱爲您的名稱作爲參數傳遞給函數,但您不創建一個值的變量。

解決方案:

這將很好地工作但如果這就是你想要做的事:

function rowFromVar($varname) { 
    $result = "<tr>"; 
    $result .= "<td>\$$varname</td>"; 
    $result .= "<td>" . $varname . "</td>"; 
    $result .= "</tr>"; 
    return $result; 
} 

// now in the HTML... 
<table><?php print rowFromVar("variable");?></table> 

從變量上這條線上面進行簡單的刪除$

$result .= "<td>" . $$varname . "</td>"; 
--------------------^ 
+0

我不認爲這是我想要的。說'$變量=「myname」'。我想要'​​$變量​​myname'。當我把'$$ varname'放到'$ varname'時,我得到'​​$變量​​變量'。換句話說,我再次獲得變量的名稱,而不是其內容。 (或者我可能誤解了?) –

+0

這隻會在變量前面打印一個'$'的變量名稱,然後再次使用相同的名稱。問題想要的是打印$ variable的值,假設它**是**集合。 –

+1

@DonFaulkner:你有沒有先嚐試過?由於您的評論,我必須創建一個演示:請參閱這裏的工作示例:http://codepad.org/kzFbsFfS而不是工作示例,例如在這裏使用兩個'$$':http://codepad.org/mtUzVPi1 – Sarfraz

1

您是否嘗試過使用$GLOBALS[$varname]而不是$$varname?本例中的變量位於全局範圍內,並且不能直接訪問函數內的全局變量。

+0

是的,這是有效的(雖然它是'$ GLOBALS',而不是'$ _GLOBALS'。你和@ john-lawrence都是對的 –

0

下面的代碼應該可以正常工作,因爲您懷疑scope是這裏的主要問題。

function rowFromVar($varname, $contents) { 
    $result = "<tr>"; 
    $result .= "<td>\$$varname</td>"; 
    $result .= "<td>" . $contents . "</td>"; 
    $result .= "</tr>"; 
    return $result; 
} 
// now in the HTML... 
<table><?php print rowFromVar("variable", $variable);?></table> 
+0

是的,這會起作用,但它只能部分解決我的問題,變量「兩次,這就是我主要試圖避免的。 –

0

請試試這個代碼:

function rowFromVar($varname) { 
    $result = "<tr>"; 
    $result .= "<td>{$varname}</td>"; 
    $result .= "<td>".$varname."</td>"; 
    $result .= "</tr>"; 
    return $result; 
} 

<table><?php echo rowFromVar("variable");?></table> 
0

我也有類似的問題,我解決了如下。

function contents_of($string) 
{ 
    eval("global $string; \$value = $string;"); 
    return "Variable $string has value $value"; 
} 

$testing = 123; 
echo contents_of('$testing'); 

// produces... 
// Variable $testing has value 123