может ли PHP делать что-то вроде p ($ i), и он печатает «$ i is 5» - C и Ruby могут ... (то есть автоматически распечатывать «$ i») - PullRequest
0 голосов
/ 13 мая 2009

Мне было интересно, может ли 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'} (передавая блок с привязкой, сделать eval) ... интересно в PHP, это тоже возможно?

Ответы [ 4 ]

3 голосов
/ 13 мая 2009

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

Конечно, вы можете сами это определить ...

p('$i');

function p($str) 
{
    echo $str, " = ", eval("return ($str);");
}
2 голосов
/ 13 мая 2009

Если вы возитесь со строкой, чтобы превратить ее в оператор возврата, вы можете использовать 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 голосов
/ 13 мая 2009

Краткий ответ: нет

Проблема с решениями на основе eval () - это область действия. Следующее не будет работать:

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

$i = 10;

p('$i + 1');

потому что $ i не будет в области при вызове eval ().

0 голосов
/ 13 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...