2009-05-13 4 views
0

PHPができるかどうかまだそれには良い解決策はないと思わとしてこれを実行します。

p($i) 

、それが印刷されます

$i is 5 

p(1 + 2) 

0を出力します
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でうんざりしていますが、それも可能でしょうか?

+0

別の「RubyはPHPより優れていますか?」という質問はありますか? :) –

+0

@CsabaKétszeriそこには疑問はありません;) –

答えて

3

バックトレースを取って、p()を呼び出すファイルを読み込んでトークン化することでこれを行うことができると思います。私はそれを "良い"解決策と呼んでいません。あなたはそれを自分で文字列化できもちろん

...

p('$i'); 

function p($str) 
{ 
    echo $str, " = ", eval("return ($str);"); 
} 
+0

を使用すると、 'var_export'を使うといいでしょう。 – Gumbo

+0

自分自身をstingify ...それはとても面白いです –

0

文字列を渡す場合は、evalを使用して計算を行うことができます。

+0

関数はグローバルを評価することができませんが、 –

2

あなたがreturn文にそれを作るために、文字列と混乱、あなたがevalを使用することができたら...

function p($expr) 
{ 
    $php="return {$expr};"; 
    echo "$expr is ".eval($php)."\n"; 
} 


p("1+2"); 

作品単純な式では$ exprの変数を参照しようとすると、関数p()のスコープ内で変数を見つけることができません - 以下のような小さなハックが役に立ちます:

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はわからない私が今までにかかわらず、生産コード:)

0

短い答えでこれを見たいと思いますreturn $GLOBALS['x']+4;

になっている:いいえ

問題をevalのを()ベースのソリューションは、スコープです。以下は動作しません。

function p($expr) 
{ 
    $php="return {$expr};"; 
    echo "$expr is ".eval($php)."\n"; 
} 

$i = 10; 

p('$i + 1'); 

eval()が呼び出されたときに$ iがスコープに含まれないためです。

関連する問題