2009-05-13 1 views
0

Мне было интересно, может ли 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 и Руби как можно это сделать ... в C, это может быть сделано stringification, и в Ruby, есть решение с использованием p{'i'} или p{'1 + 2'} (путем пропускания блок с привязкой, чтобы сделать eval) ... Интересно, в PHP, возможно ли это тоже?

+0

Другой вопрос «Рубин лучше, чем PHP»? :) –

+0

@ CsabaKétszeri там не вопрос, это;) –

ответ

3

Я думаю, что это можно сделать, взяв backtrace, затем загружая и токенизируя файл, который вызывает p(). Однако я бы не назвал это «хорошим» решением.

Конечно, вы могли stringify сами ...

p('$i'); 

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

Использование 'var_export' было бы неплохо. – Gumbo

+0

самоочевидно это ... это так смешно –

0

Ну, если вы передадите строку, вы можете использовать eval, чтобы выполнить расчет.

+0

функция не сможет оценить глобальную, хотя –

2

Если вы запутались со строкой, чтобы сделать его в обратном заявление, вы можете использовать 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 не превращается в return $GLOBALS['x']+4;

Не уверен, что я когда-либо хотел, чтобы увидеть это в рабочем коде, хотя :)

0

Короткого ответ: нет

Проблемы с Eval() на основе решений является сферой. Следующие действия не будут выполняться:

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

$i = 10; 

p('$i + 1'); 

потому что $ i не будет находиться в зоне действия, когда вызывается eval().

 Смежные вопросы

  • Нет связанных вопросов^_^