请解释它的作用:eval(“$str=”$str“;”)


Please explain what this does: eval("$str = "$str";")

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

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

不知何故,我无法理解这行代码的作用:CCD_ 1。

我猜净效果是这样的:$str = "$str";但当我用它代替eval代码时,我不会得到同样的效果。有人能带我浏览一下这行代码吗。我知道该函数带来的漏洞。但我的兴趣仅限于理解特定的代码行。

我想我现在有了答案——

CCD_ 3和CCD_。在第二种情况下,$str被求值为This is a $string with my $name in it.,而在第一种情况中,由于相同的字符串仍在eval构造中,因此将对其进行进一步求值,并生成This is a cup with my coffee in it.

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

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

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

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

这将输出:

这是一个$字符串,里面有我的$名字。

请注意,该变量没有展开。变量在单引号中使用时不会进行插值,因此结果与预期一致。此处对此进行了记录。

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

这可能就是让你困惑的地方。让我们详细检查一下。在eval("'$str = '"$str'";")0语句中,您有以下内容:

"'$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代码。因此,不鼓励使用它。如果您已经仔细验证了除了使用此构造之外没有其他选择,请特别注意,在没有事先正确验证的情况下,不要将任何用户提供的数据传递到其中。

它将字符串求值为PHP。注意第一个字符串如何不打印$string&name变量,因为字符串被单引号包围(并且变量没有转义)

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

输出为

这是一个$字符串,里面有我的$名字。

这是一个杯子,里面装着我的咖啡。

这一切都在你得到例子的页面上解释过,http://php.net/manual/en/function.eval.php

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

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

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

这实际上是evaluating这个PHP表达式

$str="$str";

你看到的反斜杠只是为了转义所需的字符。如果你把它做成,它会更清楚

eval(" '$myNewString = '"$str'"; " ); 
echo $myNewString;

由于eval的This参数是一个PHP表达式,现在带有双引号,因此将对其进行求值,并且这些变量现在将向该字符串提供其值。用同样的表达式加单引号,同样也不会起作用。