[英]can PHP do something like p($i) and it prints “$i is 5” — C and Ruby can… (that is, to print out “$i” automatically)
我想知道PHP是否可以做到這一點,因為似乎還沒有很好的解決方案:
p($i)
它會打印
$i is 5
和
p(1 + 2)
將打印
1 + 2 is 3
和
p($i * 2) => $i * 2 is 10
p(3 * factorial(3)) => 3 * factorial(3) is 18
C和Ruby都可以做到...在C語言中,可以通過字符串化來完成,而在Ruby中,有一個使用p{'i'}
或p{'1 + 2'}
的解決方案(通過使用綁定結束,進行評估)...我想知道在PHP中,是否也可能?
我認為可以通過回溯然后加載並標記調用p()
的文件來完成。 我不會稱其為“好”解決方案。
當然你可以自己把它串起來...
p('$i');
function p($str)
{
echo $str, " = ", eval("return ($str);");
}
如果將字符串弄亂以使其成為return語句,則可以使用eval ...
function p($expr)
{
$php="return {$expr};";
echo "$expr is ".eval($php)."\n";
}
p("1+2");
適用於簡單表達式,但是如果您嘗試在$ expr中引用變量,那么它將無法在函數p()的范圍內找到它-像下面這樣的hack可以幫助您:
function p($expr)
{
$php="return {$expr};";
$php=preg_replace('/\\$(\w+)/', '$GLOBALS[\'$1\']', $php);
echo "$expr is ".eval($php)."\n";
}
$x=5;
p('$x+4');
在這里,我們在代碼中搜索變量引用,並將它們轉換為$ GLOBALS數組引用。 表達式$x+4
變為return $GLOBALS['x']+4;
雖然不確定我是否想在生產代碼中看到它:)
好吧,如果您傳入一個字符串,則可以使用eval進行計算。
簡短答案:否
基於eval()的解決方案的問題在於范圍。 以下內容不起作用:
function p($expr)
{
$php="return {$expr};";
echo "$expr is ".eval($php)."\n";
}
$i = 10;
p('$i + 1');
因為在調用eval()時$ i不在范圍內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.