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

Php 请解释它的作用:eval(“\$str=\$str\”),php,eval,Php,Eval,这段代码来自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>"; ?> 不知何故,我无法理解这行代码的作用: 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>";

?>

不知何故,我无法理解这行代码的作用:
eval(\$str=\“$str\”;”)

我猜净效应是这样的:
$str=“$str”
我想我现在有了答案-


eval(“\$str=\“$str\”;”)
$str=“$str”不是一回事。在第二种情况下,$str被求值为
,这是一个$string,其中有我的$name。
在第一种情况下,同样的字符串,因为它仍然在eval构造中,被进一步求值,结果是
这是一杯咖啡。

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

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

输出为

这是一个$string,其中包含我的$name

这是一个杯子,里面有我的咖啡

这都在你的例子页面上解释过了,

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

eval("\$str = \"$str\";"); 
这实际上是
评估
这个PHP表达式

$str="$str";
你看到的反斜杠只是为了转义所需的字符。如果你把它说成

eval(" \$myNewString = \"$str\"; " ); 
echo $myNewString;
由于eval的这个参数是一个PHP表达式,现在带有双引号,因此将对它进行求值,这些变量现在将向该字符串给出它们的值。用同一个表达式加上单引号,同样是行不通的

将执行它得到的字符串,就像它是PHP代码一样

$string = 'cup';
$name = 'coffee';
这几乎是不言自明的。两个值存储在两个变量中,
$string
$name

$str = 'This is a $string with my $name in it.';
echo $str. "<br>";
  • \$str
    -使用
    \
    对变量进行转义,以避免将其解释为字符串。如果从开头删除反斜杠,PHP将抛出一个解析错误
  • \“$str\”--此处使用变量的实际值,反斜杠用于转义双引号
运行时,要执行的PHP代码如下所示:

$str = "This is a $string with my $name in it.";
最后,您只是像正常情况一样回显变量,它只会输出:

This is a cup with my coffee in it.
eval()
函数与其他函数一样,如果使用不当,可能非常危险。手册警告您:

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


运行此命令时会得到什么输出?它滥用
eval
,使用双引号替换原来单引号字符串中的
$vars
。我建议不要使用这个,因为有各种各样的问题,例如
s在源字符串中。您缺少一半的解释。。。更糟糕的是,你只是在重复手册页上的内容,根据问题判断,OP很可能已经在阅读了。你是在说这就是它的基本功能:
$str=“$str”但当我运行该代码时,输出是:这是一个$string,其中包含我的$name。您是否认为这两行代码是相同的:
eval(“\$str=\”$str\”;”)vs
$str=“$str”
@user1720897:在这个特定的示例中,是的,它们是相同的。然而,这不是eval的用途。可能会更好地演示使用方法。但是运行这两个代码会导致单独的输出-
eval(“\$str=\“$str\”;”)输出这是一个杯子,里面有我的咖啡,而
$str=“$str”
outputs这是一个$string,其中包含我的$name。@user1720897:如果使用双引号而不是单引号,则它将是相同的。看见
"\$str = \"$str\";"
$str = "This is a $string with my $name in it.";
This is a cup with my coffee in it.