这段代码来自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.
答案 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表达式,现在有双引号,它将被评估,这些变量现在将它们的值赋予该字符串。使用相同的表达式和单引号再次它不会工作。