PHP p ($ i) gibi bir şey yapmak ve onu yazdırır olabilir "$ i 5'tir"

4 Cevap php

PHP bunu eğer henüz hiç iyi bir çözüm gibi görünüyor gibi ben merak ediyorum:

p($i)

ve yazdıracaktır

$i is 5

ve

p(1 + 2)

basacaktır

1 + 2 is 3

ve

p($i * 2)  =>  $i * 2 is 10  
p(3 * factorial(3))  =>  3 * factorial(3) is 18

C ve Ruby both can do it... in C, it can be done by stringification, ve in Ruby, there is a solution using p{'i'} or p{'1 + 2'} (by passing the block with the binding over, to do an eval)... I wonder in PHP, is it possible too?

4 Cevap

Ben o zaman yüklenirken bir hata izleme raporu alarak ve p() çağırır dosyasını tokenizing tarafından yapılabilir düşünüyorum. Ama "iyi" bir çözüm demezdim.

Tabii ki kendiniz stringify olabilir ...

p('$i');

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

Return deyiminin içine yapmak için dize ile karışıklık varsa, kullanabilirsiniz eval ...

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


p("1+2");

Basit ifadeler için çalışır, ancak $ İfadeye bir değişken başvurusu için çalıştı, o zaman alışkanlık) (fonksiyon p kapsam içinde bulmak - aşağıdaki gibi bir küçük kesmek yardımcı olabilir:

function p($expr)
{
   $php="return {$expr};";
   $php=preg_replace('/\\$(\w+)/', '$GLOBALS[\'$1\']', $php);


   echo "$expr is ".eval($php)."\n";
}

$x=5;
p('$x+4');

Burada kod değişken başvuruları için arama ve $ GLOBALS dizi referanslar içine döndü ettik. Ekspresyon $x+4 return $GLOBALS['x']+4; dönüştü

Emin değilim ben hiç rağmen üretim kodunda bu görmek istiyorum :)

Eğer bir dize geçirirseniz Eh, eval hesaplama yapmak için kullanabilirsiniz.

Kısa cevap: hayır

Eval ile sorun () tabanlı çözümler kapsamı. Aşağıdaki çalışmaz:

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

$i = 10;

p('$i + 1');

$ i eval () denir kapsamında olmayacak çünkü.