2013-11-23 31 views
2

的这段代码是从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代码,我没有得到相同的效果。有人可以通过这行代码来引导我。我意识到函数带来的漏洞。但我的兴趣点仅限于理解该特定代码行。

我想我现在我的答案 -

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

当你运行它时,你会得到什么输出? –

+4

它滥用'eval'来解释原始单引号字符串中的'$ vars',通过使用双引号将其替换为它们的值。我建议不要使用这个,因为存在各种问题,比如源字符串中的'''' – Wrikken

回答

3

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

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

这几乎不言自明。两个值存储在两个变量中,分别为$string$name

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

这将输出:

这是一个字符串$在它我的名字$。

请注意,该变量未扩展。变量在单引号内使用时不会插值 - 所以结果与预期相同。这记录在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代码。因此不鼓励它的使用。如果您已经仔细核实没有其他选择而不是使用此构造,请特别注意不要将任何用户提供的数据传递给它,而不事先进行适当的验证。

+0

你会说这两行代码是相同的:''eval(“\ $ str = \”$ str \“;”);'vs'$ str =“ $ str“;' – user1720897

+0

@ user1720897:在这个特定的例子中,是的,它们是相同的,但这并不是eval的用法,[这个例子](https://eval.in/72801)可能会更好地展示它的用法。 –

+0

但是运行这两个代码会产生不同的输出 - 'eval(“\ $ str = \”$ str \“;”);'outputs这是一个杯子里装着我的咖啡,wh ereas'$ str =“$ str”;'outputs这是一个$ string,其中包含我的$名称。 – user1720897

1

它将字符串评估为PHP。 通知第一串并如何不打印$字符串& $ name变量,作为字符串由单引号(和变量的不被转义)

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

输出是,

这是一个字符串$在它我的名字$。

这是一杯咖啡。

这是你得到了来自例如在页面上解释, http://php.net/manual/en/function.eval.php

+1

你错过了一半的解释......更糟的是,你只是重复了什么手册页,从问题来看,OP很可能已经在阅读了。 – zamnuts

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表达式现在用双引号,它会进行评估和这些变量现在将给出自己的价值,以该字符串。用单引号使用相同的表达式,并再次无法工作。

+0

你的意思是说这就是它本质上做的事情:'$ str =“$ str”;'但是当我运行这段代码时,输​​出结果是:这是一个$ string,其中包含我的$ name。 – user1720897