理解php的eval()函数

时间:2015-01-24 07:51:10

标签: php merge eval

我是一名设计师,试图将自己升级为编码设计师。最近我一直在研究一些PHP代码和手册,然后我遇到了eval()函数的示例代码:

<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>

这是官方PHP网站中eval()函数的示例代码,虽然它确实帮助我理解了eval()函数,但我无法弄清楚示例代码是如何工作的。更具体一点,我无法理解为什么

("\$str = \"$str\";")

会产生合并的字符串。

我真的无法弄清楚为什么这应该有用。

2 个答案:

答案 0 :(得分:0)

你应该得到两个这样的console.log

This is a $string with my $name in it.';

This is a $cup with my $coffe in it.';

为什么呢?首先,您打印$str没有 eval的值,稍后,您将评估它们,基本上会发生这种情况,

<强>首先

打印$str,没有评估。

This is a $string with my $name in it.';

第二

这段代码,运行eval("\$str = \"$str\";");

Eval替换$string$name。使用2个新变量值,即$cup$coffe

希望你明白

答案 1 :(得分:0)

好的,这就是我们所拥有的:

eval("\$str = \"$str\";")

看,字符串是双引号:它表示$字符将被解释为变量start。所以我们用反斜杠\$来屏蔽这个角色,然后它将&#34;表示&#34;只是一个正常的美元符号。此外,字符串中的双引号也必须进行筛选。

最后我们得到了这个字符串:(我将引号更改为单引号,因此$不要混淆你):'$str = "$str";'。看,它现在看起来更像是普通代码:)

评估它,PHP将执行以下操作(为方便起见,我删除了外部引号):

eval( $str = "$str" ); 

请注意这里的双引号。这意味着内部的变量将再次被解析/解释。

由于$str原来是== 'This is a $string with my $name in it.',它会被插入到表达式中,现在它看起来像:

$str = "This is a $string with my $name in it.";

再次,双引号!它解析并替换变量$name$string,最后给我们:

$str = "This is a cup with my coffee in it."

瞧!
一个令人心碎的人,但却是学习机制的一个很好的例子。