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