2013-07-05 56 views
1

我想聲明一個包含變量名的字符串,然後讓PHP能夠從字符串中識別該變量,就像一個javascript eval。示例:php從字符串中提取變量名,有點像javascript eval

此代碼有效,因爲$ value的值是字符串中的值,而不是「$ value」。

$value="some value"; 
$str="the value is $value"; 
echo $str; 
//the value is some value 

,但我想這樣的功能:

$str2="the new value is $newValue"; 
$newValue="something new"; 
echo $str2; 
//the new value is something new 

當然,這並不在PHP中工作,因爲$ str2的分配時,$ NEWVALUE並不存在。有沒有辦法讓PHP做到這一點,能夠從字符串獲取變量名,然後獲取該變量的值?這有點像我猜的javascript eval。謝謝閱讀!

用法:我正在構建一個foreach循環內的html塊。它通過一個數組循環,因此循環內部的信息是每個數組元素的鍵和值。我正在編寫一個表單對象的方法,可以讓用戶指定輸入塊的元素。其中一些元素喜歡訪問密鑰,而有些則喜歡訪問該值。因此,例如

foreach($cars as $key=>$car) 
{ 
echo "<input id='text$key' type='text' value='".$car["model"]."'><br> 
\n<input value='choice$key' type='button' value='".$car["make"]."'> 
<br><br>\n\n"; 
} 

會產生類似

<input id="text0" type="text" value="Malibu"><br> 
<input id="choice0" type="button" value="Chevy"><br><br> 

<input id="text1" type="text" value="Escort"><br> 
<input id="choice1" type="button" value="Ford"><br><br> 

我想這是在飛行中產生的,所以說我有一些所謂的makeCarForm方法,它接受一個字符串作爲輸入,因此可以說,

function makeCarForm($formString) 
{ 
foreach($cars as $key=>$car) 
{ 
echo $formString; 
} 
} 

,然後我的字符串

$theFormString="<input id='text$key' type='text' value='".$car["model"]."'><br> 
\n<input value='choice$key' type='button' value='".$car["make"]."'> 
<br><br>\n\n"; 

,所以我可以調用諸如

makeCarForm($theFormString); 

功能,它會產生與上述相同的HTML輸出。這有意義嗎?我是否以這種錯誤的方式去做?

+0

是不是一個字符串重組更容易? ['sprintf()'](http://php.net/sprintf) – BlitZ

+0

什麼是用例?不,如果你有一個插值表達式的字符串結果,你不能得到以前的狀態或變量名稱。改爲使用printf樣式的佔位符方案。或子字符串搜索,或任何你問。 – mario

+0

我已經添加了一個用例。 – chiliNUT

回答

2

建議您不要使用eval。在過去,我只使用eval來處理需要構建動態布爾邏輯的情況。如果你必須使用它,那麼你可以按照下面的說明。

$string = '$val = "FooBar"; $out = "This is my string $val";'; //when a variable is placed inside single quotes it will not expand. 
eval($string); 
echo $out; 

不建議再次使用eval。這純粹是爲了教育目的。

+0

這就是我所需要的,但我明白eval並不是最安全的方法。 – chiliNUT

2

就變量聲明而言,沒有。但是如果你想堅持這種設計,就可以用功能。

$str2="the new value is ".newValue(); 
function newValue() 
{ 
    return 'something new'; 
} 

echo $str2;