这段代码来自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表达式,现在带有双引号,因此将对其进行求值,并且这些变量现在将向该字符串提供其值。用同样的表达式加单引号,同样也不会起作用。