请解释一下这个:eval(“\ $ str = \”$ str \“;”)

时间:2013-11-23 12:38:42

标签: php eval

这段代码来自eval上的php.net手册:

<?php

$string = 'cup';
$name = 'coffee';

$str = 'This is a $string with my $name in it.';
echo $str. "<br>";

eval("\$str = \"$str\";"); 
echo $str. "<br>";

?>

我无法理解这行代码的作用: eval("\$str = \"$str\";")

我猜测净效果是这样的:$str = "$str";但是当我使用它来代替eval代码时,我得不到相同的效果。有人可以引导我完成这行代码。我知道该功能带来的漏洞。但我的兴趣仅限于了解特定的代码行。

我想我现在有了答案 -

eval("\$str = \"$str\";")$str = "$str";不是一回事。在第二种情况下,$ str被评估为This is a $string with my $name in it.,并且在第一种情况下,相同的字符串,因为它仍然在eval构造内部进一步评估并导致This is a cup with my coffee in it.

3 个答案:

答案 0 :(得分:3)

eval()将执行它获取的字符串,就像它是PHP代码一样。

$string = 'cup';
$name = 'coffee';

这几乎是不言自明的。两个值存储在两个变量$string$name中。

$str = 'This is a $string with my $name in it.';
echo $str. "<br>";

这将输出:

  

这是一个带有$ name的$ string。

请注意,该变量未展开。当变量在单引号内使用时不会进行插值 - 因此结果与预期一致。记录在案here

eval("\$str = \"$str\";"); 
echo $str. "<br>";

这可能让你感到困惑。让我们仔细检查一下。在eval()语句中,您有以下内容:

"\$str = \"$str\";"
  • \$str - 使用\对变量进行转义,以避免将其解释为字符串。如果从头开始删除反斜杠,PHP将抛出Parse错误。
  • \"$str\"; - 此处使用变量的实际值,反斜杠用于转义双引号。

运行时,要执行的PHP代码如下所示:

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

最后,你只是正常回显变量,它只会输出:

This is a cup with my coffee in it.

eval()函数与其他任何函数一样,如果使用不当可能会非常危险。手册警告你:

  

eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。

答案 1 :(得分:1)

它将字符串计算为PHP。 注意第一个字符串如何不打印$ string&amp; $ name变量,因为字符串被单引号括起来(并且变量没有被转义)

通过eval函数运行相同的字符串将评估该字符串中的变量。

输出为,

  

这是带有$ name的$ string。

     

这是一杯加入咖啡的咖啡。

这一切都在您从中获得示例的页面上进行了解释, http://php.net/manual/en/function.eval.php

答案 2 :(得分:1)

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

还记得字符串插值吗?这不会显示变量的值,对吗?因为变量不能用单引号。现在如果你说

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

这样做基本上是evaluating这个PHP表达式

$str="$str";

你看到的反斜杠只是为了逃避所需的角色。如果你像

那样更清楚
eval(" \$myNewString = \"$str\"; " ); 
echo $myNewString;

由于eval的这个参数是一个PHP表达式,现在有双引号,它将被评估,这些变量现在将它们的值赋予该字符串。使用相同的表达式和单引号再次它不会工作。