簡體   English   中英

PHP可以執行類似p($ i)的操作,並顯示“ $ i is 5”嗎— C和Ruby可以……(即自動打印出“ $ i”)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM